Добавление дополнительной зависимости в новых правилах к существующим правилам - PullRequest
0 голосов
/ 24 сентября 2018

Я пишу 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, предназначены для одной цели. Обратите внимание, что я не хочу полностью переопределять правило запаса, а только расширяю его, чтобы добавить дополнительную зависимость.

1 Ответ

0 голосов
/ 12 октября 2018

В настоящее время нет способа сделать это с помощью Shake.Возможны следующие варианты:

  • Добавить его в Shake.Будет ли это правильно, зависит от того, насколько часто это требование - и я предполагаю, что это довольно редко, - но это требует проверки.Тот факт, что вы хотите, чтобы зависимости запускались раньше, чем правило, имеет большее значение - он как-то менее сложен, чем просто предоставление нескольких действий, которые вместе дают результат.
  • Делайте это снаружи.Мой соломенный человек должен был бы написать «дополнительные функции» как некую функцию FilePath -> Action (), а затем определить свой собственный %>, который также применил эту функцию к выводу.Он будет работать только с предварительно выбранными точками расширения, но если вы переопределите %> в верхней части файла, он может поразить все ваши экземпляры.
  • Если вы действительно хотите скрыть это больше, используйте shakeExtraхранить состояние каким-либо образом.
...