-->

功能化与蚂蚁macrodef的几行代码(Functionalizing few lines of c

2019-09-29 02:54发布

我想“功能” 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>

Answer 1:

副本任务不接受一个嵌套的宏单元,多数民众赞成在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任务 。



Answer 2:

Rebse的答案已经具备了,你应该去用什么<macrodef>和这里的一些解释。

复制任务

<copy><macrodef> <sequential>是Ant任务。 每个Ant任务的支持与Java代码。 大多数的内置Ant任务是在Java类的org.apache.tools.ant.taskdefs ,如Copy.java是后端<copy>的任务。

任务的嵌套元素由任务的Java代码来处理。 对于<copy>的任务,它在Copy.java(或其他类这取决于)处理嵌套元素代码。

您将在名为Copy.java方法参见createFilterChainaddFilesetcreateMapper等。 这就是为什么<copy>支持文件集,filterchain,映射器和其他规定嵌套元素复制的手册页 。

Macrodef

这定义使用嵌套任务作为模板的新任务。

Macrodef是一种方法来定义一个Ant任务,而不在Java编码。 原来它的嵌套蚂蚁XML行到一个新的任务,其运作方式与其他Ant任务相同。

很显然,你不应该只是把<filterchain><macrodef><filterchain>不是一个Ant任务,而是一个蚂蚁类型 。



文章来源: Functionalizing few lines of code with ant macrodef