既存の Ant プロジェクトがあり、既に最新のコンポーネントを再ビルドすることを避けて、ビルド プロセスをスピードアップしたいと考えています。
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 内に 2 つの一般的なアプローチがあるようです。
最初のアプローチは、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 のタスクを使用することです。個別のプロパティが定義されていない 1 つのターゲットであるという点で優れています。対照的に、outofdate では、プロパティの設定とテストに別のターゲットが必要です。
2 番目のアプローチは、
セレクター<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 もありますが、そのドキュメントから、この機能が提供されているかどうかわかりません。Ivy ドキュメントの主な使用例は、単一のプロジェクトの一部をステージングして無駄な作業を回避するのではなく、インターネットからサブプロジェクトをダウンロードしているようです。Maven も同様の機能を提供しており、ドキュメントで強調されている同じユース ケースがあります。(既存の重要なプロジェクトを Maven に移行することは悪夢であると言われています。対照的に、Maven を使用してグリーンフィールド開発を開始することは、より好ましいことです。)
より良い方法はありますか?