1

我有一个混乱的构建。最后,目标最多执行 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设置好了?

4

1 回答 1

1

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

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

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

在原来的情况下,我会先做一个clean,然后compile-basecompile.xml文件中调用。那时,<available>任务将运行。由于我进行了清理,因此该文件不存在,该属性gencode.exists未设置,并且buildAndCompileCodeGen目标将运行。

当我合并所有内容时,<available>任务将运行,设置gencode.exists属性。然后,当我执行 a 时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 查看iforunless参数之前,从属子句在目标上运行。这样,gencode.exists在我准备好执行buildAndCompileCodeGen目标之前,我不会设置。现在,可用任务将在我清理后运行。

于 2012-09-13T20:40:58.647 回答