1

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

有效的代码(inlined-one)如下所示:

<target name="copy-files">
        <sequential>
            <copy todir="abc" >
                <fileset dir="xyz">
                    <!--needy includes/excludes -->
                </fileset>
                <filterchain>
                <fixcrlf includes="**" eol="lf"/>
            </filterchain>
          </copy>
 </sequential></target>
4

2 回答 2

1

复制任务不接受嵌套的宏元素,这就是错误消息所说的。
将整个副本内容放入您的宏定义 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"/>

-- 编辑 -- 如果您需要文件 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 Task

于 2014-05-07T10:44:42.613 回答
0

Rebse 的回答已经显示了你应该做什么<macrodef>,这里有一些解释。

复制任务

<copy>, <macrodef>,<sequential>是 Ant 任务。每个 Ant 任务都以 Java 代码为后盾。Ant 内置任务的大部分Java 类都在 下org.apache.tools.ant.taskdefs,例如Copy.java<copy>任务的后端。

任务的嵌套元素由任务的 Java 代码处理。对于<copy>任务,它是处理嵌套元素的 Copy.java(或它所依赖的其他类)中的代码。

您将在 Copy.java 中看到以 、 和其他名称命名createFilterChainaddFileset方法createMapper。这就是为什么支持Copy 手册页<copy>中所述的文件集、过滤器链、映射器和其他嵌套元素的原因。

宏定义

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

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

显然,你不应该只放一个<filterchain>in <macrodef>,因为<filterchain>它不是一个 Ant 任务,而是一个Ant 类型

于 2014-05-07T10:53:23.280 回答