Избежание восстановления предпосылок в Ant - PullRequest
4 голосов
/ 07 декабря 2009

У меня есть существующий проект 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 более приемлемо.)

Есть ли лучший способ?

1 Ответ

1 голос
/ 27 января 2010

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

Затем плющ можно использовать для управления версиями компонентов, используемыми основным модулем проекта.

<ivy-module version="2.0">
    <info organisation="com.myspotontheweb" module="multi_module_project"/>
    <publications>
        <artifact name="main" type="jar"/>
    </publications>
    <dependencies>
        <dependency org="com.myspotontheweb" name="component1" rev="latest.integration"/>
        <dependency org="com.myspotontheweb" name="component2" rev="latest.integration"/>
        <dependency org="com.myspotontheweb" name="component3" rev="latest.integration"/>
        <dependency org="com.myspotontheweb" name="component4" rev="latest.integration"/>
    </dependencies>
</ivy-module>

Задача ivy: retrieve загрузит / скопирует только один из подмодулей, если они были изменены (опубликованы из файлов сборки)

Все это звучит сложнее, но, возможно, вы уже подразделяете проект в своем файле сборки .... Например, если задача ANT uptodate делается зависимой от одного из артефактов сборки .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...