使用ant macrodef功能化几行代码

时间:2014-05-07 10:07:32

标签: function ant macrodef

我正在尝试"使用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>

2 个答案:

答案 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 毕竟,如果它变得更复杂,您应该考虑使用Groovywrite 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(或其依赖的其他类)中的代码。

您将在使用createFilterChainaddFilesetcreateMapper和其他人命名的Copy.java方法中看到。这就是<copy>支持Copy's manual page中所述的文件集,过滤链,映射器和其他嵌套元素的原因。

<强> Macrodef

  

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

Macrodef是一种在Java中无需编码即可定义Ant任务的方法。它将嵌套的Ant xml行转换为新任务,其工作方式与其他Ant任务相同。

显然,您不应该只在<filterchain>中添加<macrodef>,因为<filterchain>不是Ant任务,而是Ant type