2016-03-01 6 views
2

Мне интересно, как лучше всего управлять настраиваемым шагом компиляции с файлами с транзитивными зависимостями, если требуется, чтобы моя задача компиляции была инкрементальной. Вот конкретный прецедент: у меня есть каталог, полный шаблонов (в этом случае шаблоны рулей). Допустим, что они находятся в каталоге pages. Некоторые из этих шаблонов включают другие шаблоны (парцеллы Handlebars). Допустим, что включенные шаблоны находятся в includes. Компиляция всех шаблонов довольно проста. Например, я мог бы использовать рули команду как handlebars <input-file> компилировать каждый файл в pages (например for (File file : srcDir) { project.exec { commandLine 'handlebars', file.name }}.Зависимости для пользовательской инкрементной задачи компиляции Gradle

При вызове команды рули компилирует input-file и, при необходимости, подъезжает какой-либо из шаблонов input-file включает в себя и любой из включает в себя те, которые включают в себя добавление и т. д. Не вдаваясь в ненужные подробности, я также могу узнать полный набор транзитивных зависимостей для шаблона при его компиляции. Так, например, если в шаблон A включены B и C, а B включает E в процесс компиляции AI узнает, что если изменения B, C или E мне нужно перекомпилировать A. Обратите внимание, что мне очень нужно скомпилировать шаблон, чтобы узнать эту информацию, поскольку мне нужно разобрать ее и определить все места, в которых она есть, как они включают разрешение и т. д.

Я хотел бы создать пользовательскую, инкрементную задачу, которая компилирует файлы, но только при необходимости. Я знаю, как объявлять вводные данные для этой задачи, и я знаю, как хранить в памяти карту из файлов в каталоге include в шаблоны на страницах, которые зависят от нее напрямую или транзитивно. Таким образом, если параметр IncrementalTaskInputs.outOfDate включает, например, include/E, я знаю, что мне нужно перекомпилировать A. До сих пор так хорошо, но я не знаю, как лучше всего это сделать.

Очевидно, что сохранение зависимостей только в памяти не будет работать, так как деамон может перезагрузиться или даже не работать (и я не совсем понимаю, какие объекты сохраняются в памяти в deamon между запусками в любом случае). Насколько я понимаю, Gradle поддерживает какой-то кеш, поэтому он сможет вычислить соответствующие значения IncrementalTaskInputs и знать, что, например, только включает/E, измененный с момента последнего запуска. Поэтому мне как-то нужно поддерживать кэш зависимостей, которые я могу прочитать с диска, когда это необходимо. Я могу сделать это вручную, просто записав их в файл, но это кажется подверженным ошибкам. Например, некорректный Ctrl-C может привести к устареванию моего кеша с кешем Gradle. Я предполагаю, что есть встроенная система, которая позволяет мне просто объявлять зависимости и иметь Gradle позаботиться о том, чтобы сохранить это вместе со своим собственным кешем. Или еще лучше, возможно, существует существующий базовый класс, который обрабатывает подобные вещи, и все, что мне нужно сделать, это объявить, каковы зависимости? Есть ли такие вещи?

ответ

2

Я также разместил это в списке разработчиков Gradle. Стефан Оэме ответил следующим ответом, который, я считаю, исправит:

Пока нет такого механизма для повторного использования. У нас есть инкрементальная компиляция для Java, и идея открытия этого еще наступила внутри. Но я еще не знаю конкретного плана.

Я не совсем ясно, на какие объекты выжить в памяти в Deamon между запусками равно

Пока buildscript классам не меняется, классы выжить между Gradle заклятий. Однако экземпляры (например, проект) воссозданы на каждой сборке. Итак, в качестве первого снимка вы можете хранить вещи в статических переменных . Если это состояние отсутствует, вы делаете полную сборку.То, что уже поможет многим, кто использует демон с вашим плагином.

Смежные вопросы