如何将嵌套参数从一个ant目标传递到另一个ant目标

时间:2014-03-21 01:55:42

标签: ant build

如何将嵌套参数从一个ant目标传递到另一个?

我需要将可变数量的嵌套元素从一个目标传递到另一个目标。

我有一个包含所有标准构建任务的公共文件,这些任务包含在我的所有项目中。 我正在添加一个新的自定义任务,它采用可变数量的嵌套参数 作为标准,所有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>

显然,这是不对的。我的问题是,做正确的方法是什么?

1 个答案:

答案 0 :(得分:0)

  

我需要将可变数量的嵌套元素从一个目标传递到另一个目标。

对于“varible”,我假设你的意思是你不知道要传递给任务的嵌套元素的确切数量,所以你想要的是像java中的method(Object param...),是吗?

尝试这样的方式并不是一个好主意。 Ant不是脚本语言,而是构建工具。它提供了有限的“脚本”可能性。

但是,您可以通过以下两种方式尝试:

1,如果你的嵌套元素只是<elementName value="xx" />的形式,你不需要任何复杂的东西。只需传递另一个包含逗号分隔的值列表的属性,然后处理自定义ant任务中的列表。 Java很容易将属性拆分为一个列表并进行处理。

2,如果您的嵌套元素可能更复杂......也许您可以尝试reference

创建一个fooTaskParams类型,可以通过id:

引用
<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&amp;和this一样。