我的构建很糟糕。最终,目标最多执行15次。大多数目标都执行了十几次。这是因为构建和目标分为10个单独的构建文件(build.xml
,build-base.xml
,compile.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
?
答案 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查看if
或unless
参数之前,依赖子句在目标上运行。这样,在我准备好执行gencode.exists
目标之前,我不会设置buildAndCompileCodeGen
。现在,可用的任务将在之后运行。