Встряхните: Сигнал, нужно ли вообще что-то перестраивать
Я использую 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 байт) - но фиксированный размер, учитывая вашу систему. Если он изменится в размере на большую величину, значит, он сделал что-то интересное.
Из этих подходов маркировка интересных правил, вероятно, является самой простой и прямой (хотя существует риск того, что вы забудете пометить что-то).