使用presetdef和antcall的异常蚂蚁行为

时间:2012-02-08 03:19:57

标签: ant build

请考虑以下来自ant build.xml的摘录:

<presetdef name="echo1def">
    <echo message="prop: ${foo}" />
</presetdef>

<presetdef name="echo2def">
    <sequential>
        <echo message="prop: ${foo}" />
    </sequential>
</presetdef>

<target name="echotarget1">
    <property name="foo" value="bar" />
    <echo1def/>
</target>

<target name="echotarget2">
    <property name="foo" value="bar" />
    <echo2def/>
</target>

<target name="echo1">
    <antcall target="echotarget1" />
</target>

<target name="echo2">
    <antcall target="echotarget2" />
</target>

调用{echotarget1,echotarget2,echo1}中的任何一个会产生prop: bar的预期输出。但是,调用echo2会产生prop: ${foo}

为什么echo2def无法解析${foo}属性?它是在同一个项目之前(即,甚至不是在antcall的另一侧)定义的。 echo1调用除了预置定义之外没有包含在<sequential>中,但它没有问题。

最后,

<target name="echo3">
    <property name="foo" value="baz" />
    <antcall target="echotarget2" />
</target>

报告prop: baz - 因此可以看到来自攻击项目的属性,即使它是在presetdef之后定义的。

1 个答案:

答案 0 :(得分:-1)

在echo2def presetdef中删除<sequential>,意思是:

<presetdef name="echo2def">
 <echo message="prop: ${foo}" />
</presetdef>

一切都会按预期工作 这是因为Apache Ant的各种“块”级别(包括顺序)存在属性范围,即local task(Ant 1.8.0中的新增功能)的工作方式。

antcall打开一个新的项目范围,没有antcall - 意味着直接调用那些目标echotarget1和echotarget2 - 它也可以解析属性$ {foo}。