我正在尝试执行一项任务,该任务应该迭代一组文件。为此,我使用ant-contrib-0.3.jar中的foreach
任务。问题是,我试图将(作为参数)传递给目标,而不是文件路径,而是文件目录路径。
以下是项目:
<project basedir="../../../" name="do-report" default="copy-all-unzipped">
<xmlproperty keeproot="false" file="implementation/xml/ant/text-odt-properties.xml"/>
<!-- -->
<taskdef resource="net/sf/antcontrib/antcontrib.properties">
<classpath>
<pathelement location="${path.infrastructure}/apache-ant-1.9.6/lib/ant-contrib-0.3.jar"/>
</classpath>
</taskdef>
<!-- -->
<target name="copy-all-unzipped">
<foreach target="copy-unzipped">
<param name="file-path">
<fileset dir="${path.unzipped}">
<include name="**/content.xml"/>
</fileset>
</param>
</foreach>
</target>
<!-- -->
<target name="copy-unzipped">
<echo>${file-path}</echo>
</target>
</project>
运行脚本时,我得到以下消息:
生成失败的
C: \Users\rmrd001\git\xslt framework\implementation\xml\ant\text odt build.xml:13:param不支持嵌套的"fileset"元素。
我可以在互联网上的几个地方(比如axis.apache.org)看到param
可以有一个嵌套的fileset
元素。
链接到的<foreach>
示例来自ApacheAxis1.xAnt任务项目。这是一个不同于Ant-Contrib项目的<foreach>
。
正如manouti所说,Ant-Contrib <foreach>
不支持嵌套的param
元素。相反,可以将<fileset>
的id
传递给<target>
,并且<target>
可以引用id
。
或者,您可以使用Ant Contrib的<for>
任务(而不是"<foreach>
"),它可以调用<macrodef>
。。。
<target name="copy-all-unzipped">
<for param="file">
<path>
<fileset dir="${path.unzipped}">
<include name="**/content.xml"/>
</fileset>
</path>
<sequential>
<copy-unzipped file-path="@{file}"/>
</sequential>
</for>
</target>
<macrodef name="copy-unzipped">
<attribute name="file-path"/>
<sequential>
<echo>@{file-path}</echo>
</sequential>
</macrodef>
请参阅http://ant-contrib.sourceforge.net/tasks/tasks/foreach.html了解如何使用CCD_ 16。param
必须是属性而不是嵌套元素:
<target name="copy-all-unzipped">
<foreach target="copy-unzipped" param="file-path">
<fileset dir="${path.unzipped}">
<include name="**/content.xml"/>
</fileset>
</foreach>
</target>
编辑:
由于嵌套的fileset元素已被弃用,您可以将其替换为path元素(我已经很久没有尝试过了,因为我使用Ant…):
<target name="copy-all-unzipped">
<foreach target="copy-unzipped" param="file-path">
<path>
<fileset dir="${path.unzipped}">
<include name="**/content.xml"/>
</fileset>
</path>
</foreach>
</target>