蚂蚁多次调用目标

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 两次进入目标 CommonDB?我认为 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>