请考虑以下来自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之后定义的。
答案 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}。