Есть два подхода к Shake, используя batch
или needHasChanged
.Для вашей ситуации я предполагаю, что rubocop
просто выдает ошибки, если есть нарушения ворса, поэтому стандартное единовременное правило будет:
"*.rb-lint" %> \out -> do
need [out -<.> "rb"]
cmd_ "rubocop" (out -<.> "rb")
writeFile' out ""
Использовать batch
Функция batch
описывает себя как:
Полезно, когда команда имеет высокую стоимость запуска - например, apt-get install foo bar baz
намного дешевлечем три отдельных вызова на apt-get install
.
И код будет примерно:
batch 3 ("*.rb-lint-errors" %>)
(\out -> do need [out -<.> "rb"]; return out) $
(\outs -> do cmd_ "rubocop" [out -<.> "rb" | out <- outs]
mapM_ (flip writeFile' "") pits)
Использование needHasChanged
Функция needHasChanged
описывает себя как:
Как и need
, но возвращает список перестроенных зависимостей с момента последнего успешного создания правила вызова.
Итак, вы бы написали:
"stamp.lint" *> \out -> do
changed <- needHasChanged listOfAllRubyFiles
cmd_ "rubocop" changed
writeFile' out ""
Сравнение
Преимущество batch
состоит в том, что он способен запускать несколько пакетов параллельно, и вы можетеустановить ограничение на количество выпечки.В отличие от needHasChanged
проще, но очень оперативно.Для многих проблем оба являются разумными решениями.Обе эти функции являются относительно недавним дополнением к Shake, поэтому убедитесь, что вы используете 0.17.2 или более позднюю версию, чтобы убедиться, что в ней есть все необходимые исправления ошибок.