Ant多次调用目标

时间:2015-04-23 14:34:54

标签: ant

我设置了一个简单的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>属性!)。

1 个答案:

答案 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>