如何将嵌套参数从一个蚂蚁目标传递到另一个蚂蚁目标?
我需要从一个目标传递一个可变数量的嵌套元素到另一个目标。
我有一个包含所有项目中所有标准构建任务的公共文件。我正在添加一个新的自定义任务,该任务接受可变数量的嵌套参数作为标准,所有ant调用都通过公共文件进行,以确保构建风格和日志记录的一致性。因此,新的自定义任务及其嵌套子任务将在公共脚本中定义。
项目构建脚本如下所示
<target name="projectBuild">
...
<ant target="_newFooTaskWrapper" antfile="commonFile">
<property name="_arg1" value="hello"/>
<property name="_arg2" value="world"/>
<nestedArg value="qux"/>
<nestedArg value="baaz"/>
...
<nestedArg value="AAAAA"/>
</ant>
...
</target>
通用脚本如下所示:
<target name ="_newFooTaskWrapper">
<echo message="Target _newFooTaskWrapper in project ${ant.project.name} from base directory ${basedir}"/>
<echo message="arg1 = ${_arg1}"/>
<echo message="arg2 = ${_arg2}"/>
<taskdef name="newFooTask" classname="org.foo.NewFooTask"/>
<typedef name="nestedArg" classname="org.foo.NewFooTask$NestedArg"/>
<newFooTask arg1="${_arg1}" arg2="${_arg2}">
<nestedArg value="qux"/>
<nestedArg value="baaz"/>
...
<nestedArg value="AAAAA"/>
</newFooTask>
显然,这是不对的。我的问题是,正确的做法是什么?
我需要从一个目标传递一个可变数量的嵌套元素到另一个目标。
对于"变量",我假设你的意思是你不知道你想传递给任务的嵌套元素的确切数量,所以你想要的是像java中的method(Object param...)
这样的东西,是吗?
尝试这种方法不是个好主意。Ant不是一种脚本语言,而是一种构建工具。它提供了有限的"脚本"可能性。
但是,您可以通过以下两种方式进行尝试:
1,如果你的嵌套元素只是<elementName value="xx" />
的形式,你不需要任何复杂的。只需传递另一个包含逗号分隔的值列表的属性,并在自定义ant任务中处理该列表。Java很容易将属性拆分为列表并处理它。
2、如果你的嵌套元素可能更复杂…也许你可以试试reference
:
创建一个可以通过id引用的fooTaskParams
类型:
<fooTaskParams id="_foo_task_params">
<nestedArg value="qux"/>
<nestedArg value="baaz"/>
...
<nestedArg value="AAAAA"/>
</fooTaskParams>
并将引用传递给另一个构建文件:
<ant target="_newFooTaskWrapper" antfile="commonFile">
<property name="_arg1" value="hello"/>
<property name="_arg2" value="world"/>
<reference refid="_foo_task_params"/>
</ant>
,然后使您的任务能够处理引用:
<newFooTask arg1="${_arg1}" arg2="${_arg2}" paramRefId="_foo_task_params" />
你可能需要注意引用覆盖,或者使你的任务能够处理ref以及接受嵌套元素。
阅读关于<ant>
和<typedef>
的ant手册以获得更多关于此方法的信息,当您遇到任何问题时,请参阅SO Q&As