Я пишу Shakefile с целью сделать его расширяемым с помощью нового Rules
.Его интерфейс - это функция mainFor :: Rules () -> IO ()
, идея в том, что клиентским проектам нужно только определить main = mainFor myCustomRules
, чтобы все это работало.mainFor customRules
определяется как группа Shake Rules
с последующим вызовом customRules
.
Это работает до тех пор, пока пользовательские правила, переданные в mainFor
, предназначены для новых целей.
Однако некоторые из моих стандартных (нестандартных) правил в основном имеют вид «запустите этот большой непрозрачный проприетарный внешний скрипт с этим вводом и надейтесь на лучшее»;и могут быть дополнительные файлы, используемые внешним скриптом в зависимости от его ввода.Например, представьте, что у меня есть правило следующего вида:
"_build/output.bin" %> out -> do
need ["_build/script.scr", "_build/src/generated.src"]
runExternalScript
Для конкретного клиентского проекта, возможно, сгенерированный исходный код содержит ссылки на другой файл _build/src/extrainput.src
.Таким образом, в пользовательских правилах, переданных mainFor
, мне не только нужны дополнительные правила для этого файла, но и существующее правило также должно быть изменено, чтобы отметить, что need
s это входные данные:
main = mainFor $ do
"_build/src/extrainput.src" %> \out -> do
generateExtraSrc
"_buld/output.bin" %> \out -> do
need ["_build/src/extrainput.src"]
но это, что неудивительно, не удается, поскольку и правило акции в mainFor
, и второе пользовательское правило, переданное в аргументе customRules
, предназначены для одной цели. Обратите внимание, что я не хочу полностью переопределять правило запаса, а только расширяю его, чтобы добавить дополнительную зависимость.