順次ビルドステップを定義するときは、depends
要素のtarget
属性を使用します。ビルドシーケンスがターゲット内のantcall
要素によって定義されたantファイルを最近見ました。説明する :
<target name="a" depends="b">
...</target>
対
<target name="a">
<antcall target="b"/>
...</target>
2つのアプローチの間に実際の違いはありますか?それらの1つが望ましいですか?
両方のアプローチの主な違いは、depends
のターゲットはalwaysが実行されるのに対し、antcall
のターゲットは、包含ターゲットが存在する場合にのみ実行されることです。
明確な例:
<target name="a" depends="b" if="some.flag">
</target>
ここでは、b
は常に実行されますが、a
はsome.flag
が定義されています。
<target name="a" if="some.flag">
<antcall target="b" />
</target>
ここで、b
は、a
がある場合、つまりsome.flag
が定義されています。
最大の違いは、Antがdepends
を介して宣言された依存関係が確実に呼び出されることを確実にすることです最大で1回。例:
<target name="a" />
<target name="b" depends="a" />
<target name="c" depends="a" />
<target name="d" depends="b, c" />
ターゲットd
を呼び出すと、b
とc
が呼び出されます。ただし、a
は一度だけ呼び出されます(b
とc
の両方がそれに依存している場合でも)。
ここで、ターゲットantcall
に依存するのではなく、d
を使用するとします。
<target name="d">
<antcall target="b" />
<antcall target="c" />
</target>
ターゲットd
を呼び出すと、ターゲットb
およびc
が呼び出されます。ただし、ターゲットa
は2回呼び出されます。1回はb
に対して、次にもう一度c
に対して呼び出されます。
つまり、antcall
は、Antの要である通常の依存関係ルールを回避します。
antcall
を通常のAntのような依存関係の代わりに使用すべきではないと思います。それがdepends
の目的です。では、いつそれを使用しますか? antcall
タスクを使用すると、定義するプロパティと参照を制御できるため(これにより、新しいAnt環境が作成され、その速度が非常に遅くなります)、同じタスクのバリアントを作成できます。たとえば、デバッグシンボルを含むものと含まないものの2つのjarファイルがあります。
ただし、antcall
を使いすぎると、ビルドスクリプトが遅く、壊れやすく、メンテナンスが難しくなります。 Antのgoto
と考えてください。それは悪です。ほとんどの適切に作成されたビルドスクリプトは、異常な場合を除いて、それを必要としません。
Antcallが使用されることは比較的まれです。
呼び出されたターゲットは新しいプロジェクトで実行されます。これは、呼び出されたターゲットによって設定されたプロパティ、参照などが呼び出し元のプロジェクトに保持されないことを意味することに注意してください。
言い換えると、antcallは、実行されるまったく新しいAntプロセスです。
antcallはantのGOTOです。ひどいです。それは、維持不可能な残骸のネズミの巣を作るための素晴らしい方法です。 ant-contribの次には、非常に複雑でメンテナンスが難しいantファイルの匂いを嗅ぐための最良の方法です。 (良いantfileでも大雑把です)
依存が適切に設定されている場合、antcallパターンとは異なり、その時点までのターゲットを正常に実行できるはずです。
誰も触れていないもう1つの理由は活気に満ちていることです。複雑なビルドであれば、ターゲットの依存関係のグラフを生成する機能は非常に便利です。 antcallを使用している場合、うんざりしています。
私は@Vladimir Dyuzhevが正しかったので、antcallはめったに使用されないことを望みます-私はそれが標準である多くの店に行ったことがあります。
<target name="a" depends="b"> ...</target>
つまり、ターゲットaからステートメントまたはタグを実行する前に、ANTはターゲットbが正常に実行されることを確認します
また、いくつかのステートメントまたはタグがターゲットの呼び出しから実行された後、antcallを使用して任意のターゲットを呼び出すことができます。