Можно ли сделать Shake реактивным, используя inotify (или что-то вроде git-приложения и использования Yesod), чтобы, если когда-либо файловая система менялась таким образом, чтобы это правило выполнялось, оно делает это при первой же возможности?Как я могу использовать библиотеку Shake для создания реактивной системы сборки?
ответ
Автор встряска, Нил Митчелл, ответил на это, говоря:
Есть несколько способов подойти к этому:
Вы можете просто повторно Shake каждый раз, когда он обнаруживает, что-то изменилось , Встряска очень оптимизирована для быстрых перестроек, если изменение требует выполнения компиляции, тогда время для Shake, чтобы выяснить, что для перестройки, возможно, минимально. Не требует изменений в Shake.
Есть определенные вещи, которые встряхивают при запуске, например, чтение базы данных встряхивания . Если есть спрос, и это окажется заметным вовремя, я бы с радостью предоставил вам возможность повторного запуска Shake дешево API - это не так уж сложно сделать.
Когда Shake делает проверку на перестройку, самая дорогая вещь это делает проверку времени модификации файла. Если слой inotify дал список измененных файлов , я мог только перепроверить вещи, которые фактически изменились на . Для массивного проекта вы, вероятно, увидите ~ 1s , проверяя время модификации, поэтому он, вероятно, немного вас купит, а не так сложно реализовать.
Если Shake активно строится, а затем что-то меняется, вы можете сделать исключение, убить все, что строится, и перезапустить Встряхнуть. Shake был тщательно протестирован с исключениями, которые были выброшены на него , и поступают правильно. Я знаю, что по крайней мере один человек использует Shake таким образом.
И наконец, если Shake активно строится, вы можете динамически прекратить только те правила, входы которых изменились и пошли снова. Shake может поддерживать эту модель, но это было бы разумным количеством работы и потребовало бы реконструировать некоторые детали. Это будет полная реактивная модель , но я подозреваю, что она только начинает приносить пользу, когда у вас есть огромное количество файлов, и несколько файлов меняются почти , но большинство файлов нет.
Мы также определили, что сочетание Встряски с утилитой, как Гоббс (также на Hackage) может сделать возможным сделать реактивную сборку.
Я использую Shake в качестве менеджера по сборке, а шаг 2 занимает около 300 мс для меня, что слишком медленно для любого разумного автоматического опроса. – nominolo
@nominolo Если это важно для вас, дайте мне знать, и я переработаю API, чтобы избежать накладных расходов с повторением. Если у вас есть профиль Haskell для вашего прецедента, я бы хотел его увидеть, так как он мог бы идентифицировать что-то еще в вине 300 мс. –
Этот вопрос не соответствует теме, потому что это запрос функции для Shake, а не вопрос программирования. –
@ PetrPudlák Я бы интерпретировал этот вопрос как «как я могу использовать библиотеку Shake для создания реактивной системы сборки», поскольку хотя бы один из ответов не требует новых функций. –