2011-02-07 13 views
2

多くのコンポーネントが完全に同じビルドシステムがありますので、ほとんどのビルドタスクで共通のファイルで 'import'を使用するように変更しています。それから、ビルドシステムは、それが依存しているモジュールもビルドする必要があります。だから私はおおよそ...Antのネストされたインポート

common.xml 
project1.xml 
    - import common.xml 
project2.xml 
    - include project1.xml 
    - import common.xml 

common.xmlには「build」という名前のターゲットがあります。私はproject2にproject1を含めることができ、拡張ポイントを使用してビルドターゲットに依存することができるようにしたい。しかし何らかの理由で、プロジェクト1にビルドターゲットがあることを認識しません。 project1.xmlで定義されているターゲットに依存するように変更すると、問題ありません。しかし、私はcommon.xmlにあるターゲットを指定できる必要があります。

どうすればよいですか?

ant-contribはありません。プロジェクトはそれを使用していましたが、私はそれを取り除こうとしているので、恐ろしい手続き型のシステムコードを作成する必要はありません。このプロジェクトには、ダイヤモンドや適切な依存グラフ(antが自動的に生成するもの)のように見える依存関係のケースが多くあり、大きな助けになります。

私は問題を説明するためにいくつかの簡単なファイルを作成しました。

<project name="top" default="build"> 
    <include file="mid.xml" as="mid" /> 
    <target name="build"> 
    <antcall target="mid.build" /> 
    </target> 
</project> 

<project name="mid" default="build"> 
    <!-- <target name="build"> --> 
    <!-- <echo message="build mid" /> --> 
    <!-- </target> --> 
    <import file="common.xml" /> 
</project> 

<project name="common"> 
    <target name="build"> 
    <echo message="build common" /> 
    </target> 
</project> 

これは失敗します。 top.xmlはmid.buildを見つけることができません。 ant -pを実行してターゲットをリストすると、ビルドとcommon.buildが表示されます。だから私はmid.xmlビルドファイルに追加しようとしましたが、私はそれを正しくビルドしました。ここでの唯一の問題は、上記の中間のXMLをコメントアウトして独自のビルドステップを定義すると、インポートによって上書きされ無視されるということです。だから、[build、mid.build]ではなく[build、common.build]になります。

答えて

2

mid.xmlのレベルで、特に、代わりinclude taskを使用してみてください:

<project name="mid" default="build"> 
    <include file="common.xml" /> 
</project> 

「含む」および「インポート」タスクがオーバーライドタスクへの代替アプローチを持っています。 を参照してください。どのように<インポート> <と異なる>? include task docs

ショートバージョン:使用のインポートターゲットを上書きするつもり 場合、そうでない 使用することは、あなたが共通の「ビルド」の目標を選んだことにしたいようですね

が含まれますそれが中間に定義されていない限り、問題は、 'import'タスクでread-in(common.xml)のバージョンがmid.xmlのものより優先されるということです。 'include'はオーバーライドを許可しないため、common.xmlが読み込まれるときに、呼び出し元(mid.xml)で定義されたものはオーバーライドされません。

例:上記mid.xmlため、ant -f top.xmlレポート:mid.xmlでbuildターゲットオーバーライドで

build: 

mid.build: 
    [echo] build common 

<project default="build" name="mid"> 
    <target name="build"> 
    <echo message="build mid" /> 
    </target> 
    <include file="common.xml" /> 
</project> 

結果は以下のようになる。

build: 

mid.build: 
    [echo] build mid