ターゲットは、ビルドプロセス中に目的の状態に到達するために連携するタスクとデータ型のコンテナです。
ターゲットは他のターゲットに依存することができ、Apache Antはこれらの他のターゲットが現在のターゲットの前に実行されていることを保証します。たとえば、コンパイル用のターゲットと配布物を作成するためのターゲットがある場合があります。コンパイルしてからでなければ配布物をビルドすることはできないため、distributeターゲットはcompileターゲットに依存しています。
Antは、depends属性内のターゲットを、出現順(左から右)に実行しようとします。ただし、先行するターゲットがそのターゲットに依存する場合、ターゲットがより早く実行される可能性があることに注意してください。
<target name="A"/> <target name="B" depends="A"/> <target name="C" depends="B"/> <target name="D" depends="C,B,A"/>
ターゲットDを実行したいとします。depends属性から、まずターゲットC、次にB、次にAが実行されると考えるかもしれません。間違いです!CはBに依存し、BはAに依存するため、まずA、次にB、次にC、最後にDが実行されます。
Call-Graph: A → B → C → D
上記のようなDなどの特定のターゲットからさかのぼる依存関係の連鎖では、複数のターゲットがそれに依存する場合でも、各ターゲットは一度だけ実行されます。したがって、Dターゲットを実行すると、まずCが呼び出され、次にBが呼び出され、次にAが呼び出されます。A、B、Cが実行された後、Dの依存関係リストに戻り、CとBの依存関係解決プロセスで既に呼び出されているため、BとAは呼び出されません。CとBのプロセスでそのような依存関係が見つからなかった場合、BとAはCの後、Dの依存関係リストのプロセスで実行されます。
ターゲットは、プロパティが設定されている場合(または設定されていない場合)に実行を実行する機能も備えています。これにより、たとえば、システムの状態(Javaバージョン、OS、コマンドラインプロパティの定義など)に応じて、ビルドプロセスの制御を向上させることができます。ターゲットにこのプロパティを認識させるには、ターゲットが反応するプロパティの名前を指定してif(またはunless)属性を追加する必要があります。**注:** 最も単純なケースでは、Antはプロパティが設定されているかどうかだけをチェックし、値は関係ありませんが、プロパティ展開を使用することで、より複雑な条件を構築できます。詳細については、プロパティのページを参照してください。例:
<target name="build-module-A" if="module-A-present"/>
<target name="build-own-fake-module-A" unless="module-A-present"/>
最初の例では、module-A-present
プロパティが設定されている場合(任意の値、例:false
)、ターゲットが実行されます。2番目の例では、module-A-present
プロパティが設定されている場合(これも任意の値)、ターゲットは実行されません。
if/unless属性では、プロパティ名を1つだけ指定できます。複数の条件を確認する場合は、チェックの結果を計算するための依存ターゲットを使用できます。
<target name="myTarget" depends="myTarget.check" if="myTarget.run"> <echo>Files foo.txt and bar.txt are present.</echo> </target> <target name="myTarget.check"> <condition property="myTarget.run"> <and> <available file="foo.txt"/> <available file="bar.txt"/> </and> </condition> </target>
Call-Graph: myTarget.check → maybe(myTarget)
if属性とunless属性のどちらも存在しない場合、ターゲットは常に実行されます。
重要:if属性とunless属性は、それらがアタッチされているターゲットのみを有効または無効にします。条件付きターゲットが依存するターゲットが実行されるかどうかは制御しません。実際、それらはターゲットが実行されようとしており、すべての先行ターゲットが既に実行された後まで評価されません。
オプションのdescription属性を使用して、このターゲットの1行の説明を提供できます。これは、-projecthelpコマンドラインオプションによって表示されます。そのような説明がないターゲットは内部的なものとみなされ、-verboseまたは-debugオプションを使用しない限り、リストされません。
いわゆる初期化ターゲットにtstampタスクを配置し、他のすべてのターゲットがそれに依存するのが良い方法です。そのターゲットが常に他のターゲットのdependsリストの最初のものになるようにしてください。このマニュアルでは、ほとんどの初期化ターゲットの名前は"init"
です。
<project> <target name="init"> <tstamp/> </target> <target name="otherTarget" depends="init"> ... </target> </project>
特にタスクが数個しかない場合は、これらのタスクをプロジェクトタグの下に直接配置することもできます(Ant 1.6.0以降)。
<project> <tstamp/> </project>
depends属性とif/unless属性が設定されている場合、depends属性が最初に実行されます。
ターゲットには、次の属性があります。
属性 | 説明 | 必須 |
---|---|---|
name | ターゲットの名前。 | はい |
depends | このターゲットが依存するターゲットの名前のカンマ区切りリスト。 | いいえ |
if | このターゲットを実行するために設定する必要があるプロパティの名前、またはtrueと評価されるもの。 |
いいえ |
unless | このターゲットを実行するために設定してはならないプロパティの名前、またはfalseと評価されるもの。 |
いいえ |
description | このターゲットの機能の簡単な説明。 | いいえ |
extensionOf | 名前付きの拡張ポイントのdependsリストに現在のターゲットを追加します。Ant 1.8.0以降。 | いいえ |
onMissingExtensionPoint | このターゲットが欠落している拡張ポイントを拡張しようとするときの処理。(fail、 warn、 ignore)。Ant 1.8.2以降。 |
いいえ;extensionOfが存在しない限り許可されず、デフォルトはfail。 |
ターゲット名は、XMLファイルのエンコーディングで有効な英数字文字列にすることができます。空文字列、カンマ,
、スペース
もこのセットに含まれています。コマンドラインとIDEで混乱を引き起こすため、将来のAntバージョンではサポートされなくなるため、これらを使用しないでください。特殊なターゲット名、またはスペースを含むターゲット名のIDEサポートは、IDEによって異なります。
-restart
などのハイフンで始まるターゲットは有効であり、コマンドラインから直接呼び出すべきではないターゲットの名前付けに使用できます。
Antのメインクラスでは、ハイフンで始まるすべてのオプションはAnt自体のオプションであり、ターゲットではありません。このため、コマンドラインからこれらのターゲットを呼び出すことはできません。一方、IDEは通常、Antのメインクラスをエントリポイントとして使用しないため、IDEから呼び出すことは通常可能です。
Ant 1.8.0以降.
拡張ポイントは、名前とdependsリストを持ち、コマンドラインから実行できるという点でターゲットに似ています。ターゲットと同様に、ビルドプロセス中の状態を表します。
ターゲットとは異なり、タスクは含まれていません。主な目的は、dependsリストで目的の状態に貢献するターゲットを収集することです。
ターゲットは、extensionOf属性を介して、拡張ポイントのdependsリストに自分自身を追加できます。自分自身を追加するターゲットは、拡張ポイントの明示的なdepends属性のターゲットの後に追加されます。複数のターゲットが自分自身を追加する場合、それらの相対的な順序は定義されていません。
拡張ポイントの主な目的は、インポートされるように設計されたビルドファイルの拡張ポイントとして機能することです。インポートされたファイルでは、拡張ポイントは到達する必要がある状態を定義し、他のビルドファイルのターゲットはその状態に貢献するために、その拡張ポイントのdependsリストに参加できます。
たとえば、インポートされたビルドファイルでコードをコンパイルする必要がある場合、次のようになります。
<target name="create-directory-layout"> ... </target> <extension-point name="ready-to-compile" depends="create-directory-layout"/> <target name="compile" depends="ready-to-compile"> ... </target>
Call-Graph: create-directory-layout → 'empty slot' → compile
そして、コンパイル前にいくつかのソースを生成する必要がある場合、メインのビルドファイルでは次のようなものを使用できます。
<target name="generate-sources" extensionOf="ready-to-compile"> ... </target>
Call-Graph: create-directory-layout → generate-sources → compile
これにより、generate-sources
ターゲットがcompile
ターゲットの前に実行されます。
generate-sources
がcreate-directory-layout
に依存する場合、dependsリストの順序に依存しないでください。その場合は、独自のdepends属性を介して明示的に依存関係を設定する必要があります。