我想“功能” ALIZE使用的蚂蚁几行代码macrodef
。 但其导致类似的错误:
copy doesn't support the nested "my-macro" element.
如果副本任务它的作品中加入filterchian我的宏的我“内联”的定义。
我的测试目标是这样的 -
<target name="copy-files">
<sequential>
<copy todir="abc" >
<fileset dir="xyz">
<!--needy includes/excludes -->
</fileset>
<my-macro/>
</copy>
</sequential>
</target>
而我的宏是这样的:
<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>
副本任务不接受一个嵌套的宏单元,多数民众赞成在errormessage的话。
把整个副本的东西进入你的macrodef,FE:
<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"/>
-编辑-如果你需要其他copysteps与文件TOFILE,你可以使用另一种元素,如果这是足够的:
<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>
通常用于大容量文件重命名的映射器使用。
毕竟,如果它变得更为复杂,你应该考虑用脚本的Groovy或编写自己的Ant任务 。
Rebse的答案已经具备了,你应该去用什么<macrodef>
和这里的一些解释。
复制任务
<copy>
, <macrodef>
<sequential>
是Ant任务。 每个Ant任务的支持与Java代码。 大多数的内置Ant任务是在Java类的org.apache.tools.ant.taskdefs
,如Copy.java是后端<copy>
的任务。
任务的嵌套元素由任务的Java代码来处理。 对于<copy>
的任务,它在Copy.java(或其他类这取决于)处理嵌套元素代码。
您将在名为Copy.java方法参见createFilterChain
, addFileset
, createMapper
等。 这就是为什么<copy>
支持文件集,filterchain,映射器和其他规定嵌套元素复制的手册页 。
Macrodef
这定义使用嵌套任务作为模板的新任务。
Macrodef是一种方法来定义一个Ant任务,而不在Java编码。 原来它的嵌套蚂蚁XML行到一个新的任务,其运作方式与其他Ant任务相同。
很显然,你不应该只是把<filterchain>
在<macrodef>
如<filterchain>
不是一个Ant任务,而是一个蚂蚁类型 。