Встряхните: Сигнал, нужно ли вообще что-то перестраивать

Я использую Shake для создания группы статических веб-страниц, которые я затем должен загрузить на удаленный хост, используя sftp. В настоящее время работает cronjob

git pull # get possibly updated sources
./my-shake-system 
lftp ... # upload

Я бы хотел избежать запуска последней команды, если Shake на самом деле ничего не восстанавливает. Есть ли способ сказать трясти "Запустить команду fooпосле всего остального, и только если ты что-то изменил! "?

Или, в качестве альтернативы, есть отчет Shake, сделал ли он что-то в коде завершения процесса?

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

1 ответ

В настоящее время не существует прямого / простого способа определить, построено ли что-либо. Это также не такая полезная концепция, как для более простых систем сборки, как определенные правила (особенно те, которые определяют storedValue возвращать Nothing) всегда будет "перезапущен", но затем очень быстро решит, что им не нужно запускать правила, которые зависят от них. Shake, это то же самое, что перезапуск. Я могу придумать несколько подходов, какой из них лучше всего зависит от вашей ситуации:

Отметьте интересные правила

Вы можете пометить каждое интересное правило (которое создает что-то, что требует загрузки) функцией, которая записывает в определенный файл. Если этот конкретный файл существует, то вам нужно загрузить. Это может работать немного лучше, как будто вы делаете несколько запусков Shake, и в первом что-то меняется, а во втором ничего не происходит, файл все равно будет присутствовать. Если это имеет смысл, используйте IORef вместо файла.

Использовать профилирование

Shake имеет довольно продвинутое профилирование. Если вы пройдете shakeProfile=["output.json"] он создаст файл JSON с подробным описанием того, что и когда было построено. Прогоны индексируются Int, с 0 для самого последнего прогона, и любые прогоны, которые ничего не построили, исключаются. Если у вас есть одно правило, которое всегда срабатывает (например, запись в фиктивный файл с alwaysRerun) Затем, если что-то выстрелило одновременно, оно восстанавливается.

Смотри .shake.database размер файла

Shake имеет базу данных, хранящуюся в shakeFiles, Каждый неинтересный запуск будет увеличиваться на довольно небольшое количество (~100 байт) - но фиксированный размер, учитывая вашу систему. Если он изменится в размере на большую величину, значит, он сделал что-то интересное.

Из этих подходов маркировка интересных правил, вероятно, является самой простой и прямой (хотя существует риск того, что вы забудете пометить что-то).

Другие вопросы по тегам