У меня есть существующий проект Ant, и я хотел бы ускорить процесс сборки
избегая повторного создания компонентов, которые уже обновлены.
Муравей позволяет вам указать, что одна цель зависит от другой, но
по умолчанию каждая предпосылка всегда перестраивается, даже если она уже до
Дата. (Это ключевое различие между Ant и make. По умолчанию make
воссоздает цель только тогда, когда это необходимо, то есть, если
новее.)
<uptodate property="mytarget.uptodate"> // in set.mytarget.uptodate task
...
</uptodate>
<!-- The prerequisites are executed before the "unless" is checked. -->
<target name="mytarget" depends="set.mytarget.uptodate" unless="mytarget.uptodate">
...
</target>
Чтобы заставить Ant перестраивать предварительные условия только при необходимости, кажется, есть два
общие подходы в рамках Ant.
Первый подход заключается в использовании задачи uptodate
для установки свойства. Затем,
Ваша задача может проверить свойство и построить только если свойство (не)
установлен.
<uptodate property="mytarget.uptodate"> // in set.mytarget.uptodate task
...
</uptodate>
<!-- The prerequisites are executed before the "unless" is checked. -->
<target name="mytarget" depends="set.mytarget.uptodate" unless="mytarget.uptodate">
...
</target>
Альтернативным первым подходом является использование задачи outofdate
из ant contrib.
Это лучше, потому что это всего лишь одна цель без отдельного свойства
определены; в отличие от устаревшего требует отдельных целей, чтобы установить и
проверить свойство.
Второй подход заключается в создании <fileset>
с использованием <modified>
селектор. Он рассчитывает MD5 хэши для файлов и выбирает файлы, MD5 которых
отличается от ранее сохраненных значений. Не обязательно устанавливать
<param name="cache.cachefile" value="cache.properties"/>
внутри селектора; по умолчанию это «cache.properties». Вот
пример, который копирует все файлы из src в dest, содержимое которых имеет
изменено:
<copy todir="dest">
<fileset dir="src">
<modified/>
</fileset>
</copy>
Ни один из них не очень удовлетворителен, так как это требует, чтобы я написал Ant
код для процесса (избегая перестройки), который должен быть автоматическим.
Есть и Айви, но я не могу судить по документации
предоставляет эту функцию. Ключевой вариант использования в документации Ivy, кажется,
загружать подпроекты из Интернета, а не избегать ненужных расходов
работать путем постановки частей одного проекта. Maven предоставляет аналогичные
функциональность, с тем же прецедентом, выделенным в его документации.
(Перемещение существующего нетривиального проекта в Maven считается кошмаром;
в отличие от этого, начало разработки новых месторождений с Maven более приемлемо.)
Есть ли лучший способ?