【问题标题】:How to pass nested arguments from one ant target to another如何将嵌套参数从一个蚂蚁目标传递到另一个
【发布时间】:2014-03-21 01:55:41
【问题描述】:

如何将嵌套参数从一个 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>

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

【问题讨论】:

    标签: ant build


    【解决方案1】:

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

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

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

    不过,您可以通过以下两种方式进行尝试:

    1,如果你的嵌套元素只是&lt;elementName value="xx" /&gt;的形式,你不需要任何复杂的东西。只需传递另一个包含逗号分隔值列表的属性,然后在您的自定义 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" />
    

    您可能需要处理引用覆盖,或者让您的任务能够处理引用以及获取嵌套元素。

    阅读 ant 的关于 &lt;ant&gt;&lt;typedef&gt; 的手册以了解有关此方法的更多信息,并在遇到任何问题时参考诸如 this 之类的 SO Q&As。

    【讨论】:

    • 是的,作为参考传递有效。请注意,要使其正常工作,我必须使用类加载器引用。也就是说,我必须在项目的构建脚本 typedef 行中声明一个 classloaderref 属性,然后将 调用中的引用与属性一起传递,然后在公共脚本中的 taskdef 和 typedef 调用中使用该 classloaderref。
    • @MicahTessler 感谢您提供更多信息。 Acutally 我以前从未尝试过,因此您的信息将对寻找类似问题的解决方案的其他人有用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-24
    • 2018-03-27
    • 1970-01-01
    相关资源
    最近更新 更多