带有presetdef和antcall的异常蚂蚁行为



考虑以下来自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>

调用{echostarget1、echostarget2、echo1}中的任何一个都会产生prop: bar的预期输出。然而,调用echo2会产生prop: ${foo}

为什么echo2def不能解析${foo}属性?它是在同一个项目中直接定义的(即,甚至不在antcall的另一边)。echo1调用除了presetdef没有封装在<sequential>中之外,它做同样的事情,没有问题。

最后,

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

报告prop: baz-因此可以看到ant调用项目的属性,即使它是在presetdef为之后定义的。

只需在echo2def presetdef中去掉<sequential>,意味着:

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

一切都将按预期进行
这是因为属性范围存在于ApacheAnt的各种"块"级别,包括顺序,这就是本地任务(Ant 1.8.0中的新任务)的工作方式。

antcall打开了一个新的项目范围,没有antcall,这意味着直接调用这些目标echostarget1和echostarget2,它也可以工作,解析属性${foo}。

相关内容

  • 没有找到相关文章

最新更新