验证Ant脚本中的两个列表属性是否具有相同数量的元素(并且并行使用它们)

时间:2014-06-30 15:46:35

标签: ant

我有一个定义文件列表的属性,并使用

进行浏览
    <foreach target="target-name" param="file"
        parallel="true" trim="true">
        <path>
            <filelist dir="${dir}" files="${files}" />
        </path>
    </foreach>

但我还有另一个属性,它为每个文件定义了一个相应的“包”。但是如何并行使用第二个列表?

  1. 验证$ {packages}是否包含与$ {files}
  2. 相同数量的元素
  3. 将$ {packages}的第n个元素提供给使用文件列表中的单个文件的目标名称任务。
  4. 或者只是确保只提供一个文件参数,如果我无法验证包。

    属性是用户可配置的,将从属性文件中提供,因此我事先并不知道。

    这听起来我超越了'ant'的功能,但这是一个现有的脚本,我需要修改它至少确保它不能用两个文件和一个包运行。如果不出意外,我只需要发现那种情况。

1 个答案:

答案 0 :(得分:1)

为了verify that the ${packages} contains the same number of elements as ${files}您可以{ - 1}}同时使用<countfilter>${packages}来计算${files}或任何其他{{1}的数量并比较这些值以确保,delimiter中的元素的数量相同。当计数相同时,您可以运行files

请参阅CountFilter

分别在packages中获取<foreach> ith iteration of <foreach>ith elements(假设${files}中的顺序符合{{1}中的顺序}})似乎并不简单。主要是因为${packages}包含只有一个 ${packages}属性,因此${files}只传输<foreach>的一个当前元素 1}}指定。
可以使用param在一个列表中使用the_input_list,并在delimiter中使用另一个列表,即<foreach>(通过从列表中提取一个元素,每次迭代${files})。

如何实现这一点取决于您。一个例子:(在${packages}

target-name

<foreach>的每次迭代中以及随后target-name <propertyregex property="curr_pkg" input="${packages}" regexp="^(.*?)," select="\1" /> <propertyregex property="${packages}" input="${packages}" regexp="^.*?," replace="" override="true"/> 的{​​{1}}的 <foreach>将在target-name中提供,它也将在${packages}中提供从${curr_pkg}移除(或者如果您不想修改{$packages},请使用替代属性