0

b.ant内部で使用する共有 ant スクリプトがありますantcall。クライアント スクリプトが使用するプロパティを計算します。include意図しないターゲットの上書きを避けるためにクライアント スクリプトの代わりに使用importしますが、これにより antcall で問題が発生します。

includeですべてのターゲットを使用する場合bはプレフィックスであり、それに応じてdepends属性bが更新されます。ただし、これは には当てはまりませんantcallこれを処理する方法はありますか。つまり、antcall常に「ローカル」の ant ターゲットを呼び出すようにする方法はありますか?

を使用してこれを回避できimportますが、すべての上書きの問題が発生します。dependsantcall の代わりに使用することはできません。


サンプルファイル

私は2つのファイルを持っています:

アリ

  <project>
    <include file="b.ant" as="b" />
    <target name="test-depends" depends="b.depend">
      <echo>${calculated-property}</echo>
    </target>
    <target name="test-call" depends="b.call">
      <echo>${calculated-property}</echo>
    </target>
  </project>

b.ant

<project>
  <target name="depend" depends="some-target">
    <property name="calculated-property" value="Hello World"/>
  </target>
  <target name="call">
    <antcall target="some-target" inheritrefs="true"/>
    <property name="calculated-property" value="Hello World"/>
  </target>
  <target name="some-target"/>
</project>

出力例

呼び出しtest-dependは期待どおりにtest-call機能しますが、次の出力で失敗します。

b.call:

BUILD FAILED
D:\ws\rambo2\ws-dobshl\ant-test\b.ant:6: The following error occurred while executing this line:
Target "some-target" does not exist in the project "null". 

Total time: 258 milliseconds
4

2 に答える 2

2

Ant は、依存関係マトリックス仕様言語です。通常、一連の<antcall/><ant/><include/>および<import/>は、ビルド スクリプトが適切に作成されていないことを示しています。これは、Ant をプログラミング言語のように動作させようとする開発者です。

開発者にとって、プログラムを小さなファイルに分割することは理にかなっています。Python および Perl スクリプトでさえ、この恩恵を受けることができます。ただし、Ant ビルド スクリプトを分割すると、通常は問題が発生します。プロセスを改善するために、すべてのプロジェクトを調査し、すべての build.xml ファイルを 6 つまたは 7 つの個別のビルド ファイルに分割する開発者がいました。基本的に、Ant の依存関係メカニズム全体が壊れました。それを修正するために、彼はたくさんの<ant/>電話と<include>タスクを投入しました。最終的に、各ターゲットが 12 ~ 20 回呼び出されることになりました。

使用<import/><antcall/>ないことは、厳格で迅速なルールではありません。しかし、私は Ant を何年も使用しており、これらのメカニズムを使用することはめったにありません。私がそうするとき、それは通常、複数のプロジェクトが使用する共有ビルド ファイル (あなたが持っているもののように聞こえます) のためですが、共有ビルド ファイルでターゲットを定義する代わりに、マクロを定義します。これにより、発生していたターゲット名前空間の問題が解消され、マクロは Ant タスクのように動作するため、より適切に機能します。これは特に<local/>、Ant 1.8 で導入された に当てはまります。

<macrodef/>ターゲットの代わりに使用するように共有ビルド ファイルを再構築できるかどうかを確認します。共有ビルド ファイルを含めるのがずっと簡単になります。

于 2013-05-31T14:16:18.863 に答える
1

b.ant の に a を指定してから、 の を変更nameします。<project>target<antcall>

<project name="b"> <!-- Give the project a name -->
  <target name="depend" depends="some-target">
    <property name="calculated-property" value="In b.depend"/>
  </target>
  <target name="call">
    <!-- Specify the name of the project containing the target -->
    <antcall target="b.some-target" inheritrefs="true"/>
    <property name="calculated-property" value="In b.call"/>
  </target>
  <target name="some-target"/>
</project>

の結果ant -f a.ant test-call:

b.call:

b.some-target:

test-call:
     [echo] In b.call

BUILD SUCCESSFUL

b.ant への変更により、属性<include>を削除することで a.ant を簡素化できます。as

<include file="b.ant" />
于 2013-05-31T15:20:51.713 に答える