蚂蚁多次调用目标
Ant calling targets several times
我设置了一个简单的 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>
属性!)。
I thought macrodef would be executed inside the same Ant flow and project scope
确实如此。当您调用 ant FooBar2 FooBar
时,两个目标都在同一个 Ant 项目中执行。但是在这种情况下,当它也是第二个目标的依赖项时,Ant 不会 "track" 依赖目标已经执行。
当一个依赖目标只在一个目标的同一依赖链中时,它只被调用一次,例如:
<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。
解决此问题的一种方法是在目标上添加条件以在设置 属性 时跳过 运行ning 它:
<target name="Common" unless="common.already.executed">
<mkjar tgt="Common" />
<property name="common.already.executed" value="true" />
</target>
我设置了一个简单的 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>
属性!)。
I thought macrodef would be executed inside the same Ant flow and project scope
确实如此。当您调用 ant FooBar2 FooBar
时,两个目标都在同一个 Ant 项目中执行。但是在这种情况下,当它也是第二个目标的依赖项时,Ant 不会 "track" 依赖目标已经执行。
当一个依赖目标只在一个目标的同一依赖链中时,它只被调用一次,例如:
<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。
解决此问题的一种方法是在目标上添加条件以在设置 属性 时跳过 运行ning 它:
<target name="Common" unless="common.already.executed">
<mkjar tgt="Common" />
<property name="common.already.executed" value="true" />
</target>