web-dev-qa-db-ja.com

ant依存とantcall

順次ビルドステップを定義するときは、depends要素のtarget属性を使用します。ビルドシーケンスがターゲット内のantcall要素によって定義されたantファイルを最近見ました。説明する :

<target name="a" depends="b">
...</target>

<target name="a">
<antcall target="b"/>
...</target>

2つのアプローチの間に実際の違いはありますか?それらの1つが望ましいですか?

49
kostja

両方のアプローチの主な違いは、dependsのターゲットはalwaysが実行されるのに対し、antcallのターゲットは、包含ターゲットが存在する場合にのみ実行されることです。

明確な例:

<target name="a" depends="b" if="some.flag">

</target>

ここでは、bは常に実行されますが、asome.flagが定義されています。

<target name="a" if="some.flag">
    <antcall target="b" />
</target>

ここで、bは、aがある場合、つまりsome.flagが定義されています。

55
Laurent Pireyn

最大の違いは、Antがdependsを介して宣言された依存関係が確実に呼び出されることを確実にすることです最大で1回。例:

<target name="a" />

<target name="b" depends="a" />

<target name="c" depends="a" />

<target name="d" depends="b, c" />

ターゲットdを呼び出すと、bcが呼び出されます。ただし、aは一度だけ呼び出されます(bcの両方がそれに依存している場合でも)。

ここで、ターゲット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と考えてください。それは悪です。ほとんどの適切に作成されたビルドスクリプトは、異常な場合を除いて、それを必要としません。

81
Richard Steele

Antcallが使用されることは比較的まれです。

呼び出されたターゲットは新しいプロジェクトで実行されます。これは、呼び出されたターゲットによって設定されたプロパティ、参照などが呼び出し元のプロジェクトに保持されないことを意味することに注意してください。

言い換えると、antcallは、実行されるまったく新しいAntプロセスです。

14

antcallはantのGOTOです。ひどいです。それは、維持不可能な残骸のネズミの巣を作るための素晴らしい方法です。 ant-contribの次には、非常に複雑でメンテナンスが難しいantファイルの匂いを嗅ぐための最良の方法です。 (良いantfileでも大雑把です)

依存が適切に設定されている場合、antcallパターンとは異なり、その時点までのターゲットを正常に実行できるはずです。

誰も触れていないもう1つの理由は活気に満ちていることです。複雑なビルドであれば、ターゲットの依存関係のグラフを生成する機能は非常に便利です。 antcallを使用している場合、うんざりしています。

私は@Vladimir Dyuzhevが正しかったので、antcallはめったに使用されないことを望みます-私はそれが標準である多くの店に行ったことがあります。

7
thekbb
  <target name="a" depends="b"> ...</target> 

つまり、ターゲットaからステートメントまたはタグを実行する前に、ANTはターゲットbが正常に実行されることを確認します

また、いくつかのステートメントまたはタグがターゲットの呼び出しから実行された後、antcallを使用して任意のターゲットを呼び出すことができます。

0
ponds