propertyselectorタグによって生成されたリストをソートするのに役立ちます。これをテストするには、重複したプロパティを入れて、どれが定義されているかを確認します。ここbuild.properties
です:
dup.prop = foo
dup.prop = bar
そして、ここに私のAntスクリプトは次のとおりです。
これを実行する
<project>
<property file="build.properties"/>
<echo>Dup.prop is set to "${dup.prop}".</echo>
</project>
、私が買ってあげる:
値
fooのが
build.properies
で最初に定義されているため
Dup.prop is set to "foo".
プロパティが定義されると、(簡単に)変更することはできません。
あなたがしようとしているのは、定義されている順序でプロパティにアクセスすることです。プロパティはハッシュに格納されるため、これは保証されません。
あなたはサブプロジェクトについて言及しており、それらのサブプロジェクトは特定の順序で作成する必要があります。残念ながら、実際の問題の概要や、プロジェクトやサブプロジェクト用のサンプルビルドスクリプトを提供してくれなかったため、何が問題になるのかを正確に伝えるのは難しいです。
最初に、Antはビルドマトリックス言語です。つまり、依存関係の階層を持っています。開発者が抱えている最大の問題は、マトリックス言語を特定の順序で実行するよう強制しようとしていることです。 build.xmlファイルには依存関係の階層を指定する必要があります(存在する数が少ないほど、Antが物事を正しく取得するのが容易になります)。
サブプロジェクト "B"がサブプロジェクト "A"のjarファイルに依存する場合、サブプロジェクト "B"のAntスクリプトでサブプロジェクト "A" jarビルドに依存する必要があります。プロジェクトの「B」のための上記build.xml
で
<project name="proj-b"/>
...
<target name="build-jar"
depends="test.if.jar.exists"
unless="jar.exist">
<ant directory="${proj.a.dir}"
target="build.depend.jar"/>
</target>
<target name="test.if.jar.exists">
<condition property="jar.exists">
<available file="${proj.a.dir}/dist/${dend.jar.file}"/>
</condition>
</target>
<target name="compile"
depends="build-jar">
....
</target>
...
</project>
、私はプロジェクト「B」をコンパイルする前に、プロジェクトは「」構築するいくつかのjarファイルに依存しています。したがって、私のcompile
タスクは、ターゲット "A"のjarファイルを構築するbuild-jar
に依存します。このタスクがProject Aのjarファイルを何度も作成するのを防ぐために、このjarが存在するかどうかを調べるためのテストとして<condition>
を使用します。それが既にある場合、私は瓶を再構築しません。この場合
:
- ターゲットは "コンパイル" が呼ばれています。そのターゲットはターゲット「ビルド・ジャー」に依存していることを認識します。
- Before Target "compile"が実行されます。ターゲット "build-jar"が最初に呼び出されます。
- ターゲット "build-jar"は、ターゲット "test.if.jar.exists"に依存します。前
- は「-jarファイルをビルドする」実行され、それはjarファイルがすでに存在する場合、プロパティ
jar.exists
がなる、「test.if.jar.exists」ターゲット「test.if.jar.exists」で
- ターゲットを呼び出しますセット。
- ターゲット "build-jar"がアクティブになり、プロパティー
jar.exists
が設定されているかどうかを確認します。そうであれば、ターゲットは実行されません。
- 最後に、制御はターゲット "コンパイル"に戻り、次に実行されます。
ここでは、直接注文することはありません。代わりに、私が指定した依存関係階層を持つだけで、Antには何をすべきか正確に把握させました。
依存するjarの問題が大きな問題である場合は、Ivyを参照することもできます。 Ivyでは、のJarリポジトリを作成できます。残りのプロジェクトが依存しているjarをビルドするプロジェクトは、このリポジトリから必要なjarファイルを取得できます。これはMavenと非常によく似ています。実際に、IvyのAntはMavenリポジトリを使用できます。我々は、AntプロジェクトのためにローカルのMavenリポジトリマネージャーArtifactoryを使用します。
はまた、あなたがサブ・プロジェクト「B」前ビルドサブプロジェクト「A」と言うことができるでしょうビルドパスを指定することができない<subant>
タスクを試すことができます。 ビルドパスを別のAnt XMLファイルに定義することができます。このファイルは顧客に依存する可能性があり、<import>
を使用してそのプロジェクトのビルドパスをインポートします。
この主なAntタスクは、他のantサブプロジェクトをビルドするパッケージングプロジェクトですが、顧客に応じていくつかのプロジェクトをビルドする必要があるため、他のプロジェクトをビルドする必要がありません。 – itomorow
しかし、あなたがタスクを動かすのを妨げる方法はわかりません。すべてのタスクを含むビルドファイルが1つある場合は、それを呼び出して顧客に応じて必要なタスクを作成するだけです。 – Dolda2000
例としては、メインプロジェクトが1つしかありません。これは他のビルドの前にビルドする必要があります。したがって、私のメインのアリでは、リストに2回反復する必要があります。 このメインプロジェクトがプロパティファイルそうであればビルドタスクを呼び出す)、for-loopで別のビルドタスクを呼び出すことができます。それはスマートな解決策ではありませんが、他のプロジェクトが宣言され、このプロジェクトは他のプロジェクトの前に2番目の位置に構築されなければなりません... もし私が望むことができれば、この2番目のプロジェクトのlitte部分はAPIの最初の部分はありますが、私はこの決定をすることはできません。 – itomorow