Ant:antcall构建文件中设置的属性会发生什么?

时间:2012-09-13 19:12:27

标签: ant build

我的构建很糟糕。最终,目标最多执行15次。大多数目标都执行了十几次。这是因为构建和目标分为10个单独的构建文件(build.xmlbuild-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

1 个答案:

答案 0 :(得分:1)

好的,我知道发生了什么......

是的,当我通过compile-base任务调用compile.xml文件中的<ant>目标时,所有不在目标下的任务都会在执行目标I调用之前执行。这意味着,如果代码已经存在,则调用buildAndCompileCodeGen目标但不执行。

我所做的是将所有构建文件合并到一个大文件中,并删除所有<ant><antcall>任务。我已将<available>任务放在合并的build.xml文件中。

在原始情况下,我首先会clean,然后在compile-base文件中调用compile.xml。那时,<available>任务将运行。由于我干净了,文件不存在,属性gencode.exists没有设置,buildAndCompileCodeGen目标会运行。

当我合并所有内容时,<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.exists。即使已设置属性gencode.exists,也会执行此操作。在Ant查看ifunless参数之前,依赖子句在目标上运行。这样,在我准备好执行gencode.exists目标之前,我不会设置buildAndCompileCodeGen。现在,可用的任务将在之后运行