Может ли правило встряхивания определить, какие «потребности» изменились с момента последней сборки? - PullRequest
0 голосов
/ 05 декабря 2018

Я строю систему сборки на основе Shake для большой базы кода Ruby (+ другие вещи), но я изо всех сил пытаюсь разобраться с командами Ruby, которые ожидают передачи списка файлов для "сборки".

Возьмите Rubocop (средство для подкладки).Я вижу три варианта:

  • нужны все файлы Ruby по отдельности;если они меняются, запустите rubocop для каждого файла, который изменился для каждого измененного файла (очень медленно при первой сборке или если много файлов ruby ​​изменяются из-за большого времени запуска rubocop)
  • нужны все файлы Ruby;если что-то изменилось, запустите rubocop для всех файлов ruby ​​(очень медленно, если изменился только один или два файла, потому что rubocop работает медленно, если файл изменился или нет)
  • needвсе файлы Ruby;если что-то изменилось, передайте rubocop список измененных зависимостей, обнаруженных Shake

Первые два правила тривиальны для построения Shake, но моя проблема в том, что я не могу понять, как представить этот последний случай какПравило встряхивания.Кто-нибудь может помочь?

1 Ответ

0 голосов
/ 05 декабря 2018

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

...