我设置了一个简单的Ant脚本来理解为什么在我指定要执行的几个目标时(在Eclipse中)多次调用我的依赖目标:
<project name="test">
<macrodef name="mkjar" description="Build a jar from 'tgt'">
<attribute name="tgt" />
<sequential>
<echo message="mkjar @{tgt}" level="info" />
</sequential>
</macrodef>
<target name="Common">
<mkjar tgt="Common" />
</target>
<target name="Net" depends="Common">
<mkjar tgt="Net" />
</target>
<target name="DB" depends="Common">
<mkjar tgt="DB" />
</target>
<target name="FooBar" depends="Common,DB">
<mkjar tgt="FooBar" />
</target>
<target name="FooBar2" depends="Common,Net,DB">
<mkjar tgt="FooBar2" />
</target>
</project>
输出:
Buildfile: buildtest.xml
Common:
[echo] mkjar Common
Net:
[echo] mkjar Net
DB:
[echo] mkjar DB
FooBar2:
[echo] mkjar FooBar2
Common:
[echo] mkjar Common
DB:
[echo] mkjar DB
FooBar:
[echo] mkjar FooBar
BUILD SUCCESSFUL
Total time: 283 milliseconds
为什么Ant会两次进入目标Common
和DB
?我以为macrodef
将在同一个Ant流程和项目范围内执行。我用antcall
<target name="mkjar" unless="jar-${tgt}">
<property name="jar-${tgt}" value="true" />
...
</target>
但它并不好(它甚至创造了几个jar-<tgt>
属性!)。
答案 0 :(得分:1)
我认为macrodef将在同一个Ant流程和项目范围内执行
确实如此。当您调用ant FooBar2 FooBar
时,两个目标都在同一个Ant项目中执行。但在这种情况下,当Ant也是第二个目标的依赖时,Ant不会“跟踪”依赖目标已经执行。
仅当依赖目标位于同一个目标依赖链中时,才会调用一次依赖目标,例如:
<target name="A"/>
<target name="B" depends="A"/>
<target name="C" depends="B"/>
<target name="D" depends="C,B,A"/>
运行ant D
时,会运行以下目标链:A --> B --> C --> D
。
有关详细信息,请参阅https://ant.apache.org/manual/targets.html。
解决此问题的一种方法是在目标上添加一个条件,以便在设置属性时跳过它:
<target name="Common" unless="common.already.executed">
<mkjar tgt="Common" />
<property name="common.already.executed" value="true" />
</target>