1

私は混乱しているビルドを持っています。最終的に、ターゲットは最大 15 回実行されます。ほとんどのターゲットは、12 回以上実行されます。build.xmlこれは、ビルドとターゲットが 10 個の個別のビルド ファイル ( 、build-base.xmlcompile.xmlなど)に分割されているためです。

多くのビルド ファイルでは、最初 <property>にビルド ファイル内のすべてのターゲットの外側にタスクがあります。これらは通常、ターゲットが呼び出される前に最初に実行されます。

これが私のbuild.xmlファイルです:

 <import file="build-base.xml"/>

 [...]

 <target name="compile-base">
      <antcall target="setup-tmpj"/>
      <ant antfile="compile.xml" target="compile-base"/>
      [...]
 </target>

compile.xmlファイルは次のとおりです。

 <import file="build-base.xml"/>

 <property name="target" value="1.5"/>
 <available file="target/gensrc/com"   property=gensrc.exists"/>

 [...]

 <target name="buildAndCompileCodeGen" unless=gensrc.exists">
    <blah blah blah/>
 </target>

 <target name="compile-base" depends="buildAndCompileCodeGen">
     <blah blah blah/>
 </target>

私はこれを実行します:

$ ant -f build.xml compile-base

compile-baseこれにより、ファイル内のターゲットが呼び出されcompile.xmlます。buildAndCompileCodeGenこれは、ファイル内のターゲットに依存しcompile.xmlます。ただし、ターゲットは、プロパティが設定buildAndCompileCodeGenされていない場合にのみ実行されます。gensrc.exists

compile.xmlファイルにはプロパティ<available>を設定するタスクがありgensrc.existsますが、このタスクは のすべてのターゲットの外側にありますcompile.xml。その<available>タスクはこれまでに呼び出されたので、gensrc.exist設定されていますか?

4

1 に答える 1

1

さて、私は何が起こっているのかを理解しました...

はい、タスクを介してファイル内のcompile-baseターゲットを呼び出すと、呼び出したターゲットが実行される前に、ターゲットの下にないすべてのタスクが実行されます。つまり、コードが既に存在する場合、ターゲットは呼び出されますが実行されません。compile.xml<ant>buildAndCompileCodeGen

私がしたことは、すべてのビルド ファイルを 1 つの大きなファイルに結合し、すべてのタスク<ant><antcall>タスクを削除することでした。結合されたファイルに<available>タスクを入れていました。build.xml

元の状況では、最初に を実行してから、ファイルcleanを呼び出します。その時点で、タスクが実行されます。クリーンを行ったので、ファイルは存在せず、プロパティは設定されておらず、ターゲットは実行されます。compile-basecompile.xml<available>gencode.existsbuildAndCompileCodeGen

すべてを組み合わせると、<available>タスクが実行され、gencode.existsプロパティが設定されます。次に、 を実行したときにclean、生成コードを削除します。ただし、既に設定されているbuildAndCompileCodeGenため、ターゲットはまだ実行されません。gencode.exists

すべきことはこれです:

 <target name="compile-base"
     depends="buildAndCompileCodeGen">
     <echo>Executing compile-base</echo>
 </target>

 <target name="buildAndCompileCodeGen"
     depends="test.if.gencode.exists"
     unless="gencode.exists">
     <echo>Executiing buildAndCompileCodeGen</echo>
 </target>

 <target name="test.if.gencode.exists">
     <available file="${basedir}/target/gensrc/com"
         property="gencode.exists"/>
 </target>

この場合、 を呼び出しますcompile-base。それは を呼び出しますbuildAndCompileCodeGen。それが最初に最初に呼び出されますtest.if.gencode.existsgencode.existsこれは、プロパティが既に設定されている場合でも行われます。従属節は、Ant がifまたはunlessパラメータを調べる前に、ターゲットで実行されます。このようにして、ターゲットgencode.existsを実行する準備が整うまで設定しません。これで、クリーンアップを行った後buildAndCompileCodeGenに、利用可能なタスクが実行されます。

于 2012-09-13T20:40:58.647 に答える