4

既存の 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 を使用してグリーンフィールド開発を開始することは、より好ましいことです。)

より良い方法はありますか?

4

1 に答える 1

1

この大きなビルドの条件付きコンパイルは、私が最初にANTで見逃していたmakeの機能です。ターゲットの依存関係を使用するのではなく、大きなプロジェクトを小さなモジュールに分割し、それぞれを共通の共有リポジトリに公開することをお勧めします。

その後、Ivy を使用して、プロジェクトのメイン モジュールで使用されるコンポーネントのバージョンを制御できます。

<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タスクは、サブモジュールが変更されている (ビルド ファイルから公開されている) 場合にのみ、サブモジュールの 1 つをダウンロード/コピーします。

すべてがより複雑に聞こえますが、ビルド ファイル内でプロジェクトを既に細分化している可能性があります。

于 2010-01-27T20:43:09.143 に答える