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