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

使用presetdef和antcall的异常蚂蚁行为,ant,build,Ant,Build,考虑以下ant build.xml的摘录: 调用{echotarget1,echotarget2,echo1}中的任何一个都会产生prop:bar的预期输出。然而,调用echo2会产生prop:${foo} 为什么echo2def不能解析${foo}属性?它在同一个项目中(即,甚至在antcall的另一端都没有定义)定义过。echo1调用除了presetdef没有包装在中之外,执行相同的操作,没有问题 最后, <target name="echo3"> <prope

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


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

为什么
echo2def
不能解析
${foo}
属性?它在同一个项目中(即,甚至在antcall的另一端都没有定义)定义过。echo1调用除了presetdef没有包装在
中之外,执行相同的操作,没有问题

最后,

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

报告
prop:baz
-因此可以看到antcalling项目的属性,即使它是在预设定义之后定义的。

只需在echo2def预设定义中去掉
,意思是:

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

所有这些都将按预期工作。
这是因为属性作用域存在于ApacheAnt的各种“块”级别,包括sequential,这就是(Ant1.8.0中的新功能)的工作方式


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

。。。但问题是——presetdef可以使用或任何其他任务——我之所以使用它,是因为它是最简单的,但您可能会遇到相同的问题或其他任何问题。您是对的,它可能包含任何嵌套任务,但请参阅我编辑的回答OK,然后解释echo1工作的原因。它还使用antcall,在其他方面与另一个示例相同。我认为本地注释与此无关-它只讨论嵌套范围中的阴影,但在这里,内部内容甚至可以看到外部范围中定义的内容。很容易看出,即使通过antcall,目标通常也会看到“父”ant进程中定义的属性。回答1:echo1起作用,因为它调用echotarget1,它调用echo1def presetdef,它*不使用顺序*回答2:是,通常在使用antcall和inheritAll=true时属性可用(这是默认设置)-但当涉及到sequential时(如您的示例中所示),则不会。问题:为什么不在presetdef中使用sequential?对我来说毫无意义。毕竟,出于许多原因,您应该避免使用antcall,而应使用macrodef(因为Ant 1.6.x)。