我正在尝试"使用macrodef
来确定几行ant代码。但它导致的错误如下:
copy doesn't support the nested "my-macro" element.
如果我"内联"在复制任务中添加filterchian的my-macro的定义。
我的测试目标看起来像这样 -
<target name="copy-files">
<sequential>
<copy todir="abc" >
<fileset dir="xyz">
<!--needy includes/excludes -->
</fileset>
<my-macro/>
</copy>
</sequential>
</target>
my-macro看起来像这样:
<macrodef name="my-macro">
<sequential>
<filterchain>
<fixcrlf includes="**" eol="lf"/>
</filterchain>
</sequential>
</macrodef>
有效的代码(内联一个)看起来像:
<target name="copy-files">
<sequential>
<copy todir="abc" >
<fileset dir="xyz">
<!--needy includes/excludes -->
</fileset>
<filterchain>
<fixcrlf includes="**" eol="lf"/>
</filterchain>
</copy>
</sequential></target>
答案 0 :(得分:1)
复制任务不接受嵌套的宏元素,这就是错误消息所说的内容。
将整个副本放入你的macrodef,f.e。 :
<macrodef name="my-macro">
<attribute name="dest"/>
<attribute name="fsdir"/>
<attribute name="fsincludes"/>
<attribute name="fsexcludes"/>
<attribute name="fixincl"/>
<sequential>
<copy todir="@dest}">
<fileset dir="@{fsdir}">
<include name="@{fsincludes}"/>
<exclude name="@{fsexcludes}"/>
</fileset>
<filterchain>
<fixcrlf includes="@{fixincl}" eol="lf"/>
</filterchain>
</copy>
</sequential>
</macrodef>
- 编辑 -
如果文件集的数量不同,请删除fsincludes和fsexcludes属性,如果对所有文件集无效并使用如下元素:
<macrodef name="my-macro">
<attribute name="dest"/>
<element name="fs" description="nested filesets"/>
<attribute name="fixincl"/>
<sequential>
<copy todir="@dest}">
<!-- 1-n nested filesets) -->
<fs/>
<filterchain>
<fixcrlf includes="@{fixincl}" eol="lf"/>
</filterchain>
</copy>
</sequential>
</macrodef>
<my-macro dest="C:/whatever" fixincl="**">
<fs>
<fileset dir="." includes="**/*.foo"/>
<fileset dir="../foo" includes="**/*.xml"/>
<!-- ... -->
</fs>
</my-macro>
- 编辑 -
要使用嵌套文件集复制单个文件,请使用:
<fileset file="C:/somepath/some.file"/>
- 编辑 -
如果您需要其他具有文件tofile的copysteps,如果足够,您可以使用另一个元素:
<macrodef name="my-macro">
<attribute name="dest"/>
<element name="copyfiles" description="nested copy"/>
<element name="fs" description="nested filesets"/>
<attribute name="fixincl"/>
<sequential>
<copy todir="@dest}">
<!-- 1-n nested filesets) -->
<fs/>
<filterchain>
<fixcrlf includes="@{fixincl}" eol="lf"/>
</filterchain>
</copy>
<copyfiles/>
</sequential>
</macrodef>
<my-macro dest="C:/whatever" fixincl="**">
<fs>
<fileset dir="." includes="**/*.foo"/>
<fileset dir="../foo" includes="**/*.xml"/>
<!-- ... -->
</fs>
<copyfiles>
<copy file="..." tofile="..."/>
<!-- ... -->
</copyfiles>
</my-macro>
通常,对于文件的批量重命名,使用mapper 毕竟,如果它变得更复杂,您应该考虑使用Groovy或write your own Ant Task编写脚本。
答案 1 :(得分:0)
Rebse的回答已经显示了你应该使用<macrodef>
的内容,这里有一些解释。
复制任务
<copy>
,<macrodef>
,<sequential>
是Ant任务。每个Ant任务都支持Java代码。大多数内置Ant任务的Java类都在org.apache.tools.ant.taskdefs
下,例如Copy.java是<copy>
任务的后端。
任务的嵌套元素由任务的Java代码处理。对于<copy>
任务,它是处理嵌套元素的Copy.java(或其依赖的其他类)中的代码。
您将在使用createFilterChain
,addFileset
,createMapper
和其他人命名的Copy.java方法中看到。这就是<copy>
支持Copy's manual page中所述的文件集,过滤链,映射器和其他嵌套元素的原因。
<强> Macrodef 强>
这定义了一个使用嵌套任务作为模板的新任务。
Macrodef是一种在Java中无需编码即可定义Ant任务的方法。它将嵌套的Ant xml行转换为新任务,其工作方式与其他Ant任务相同。
显然,您不应该只在<filterchain>
中添加<macrodef>
,因为<filterchain>
不是Ant任务,而是Ant type。