1

I am trying to "function"alize few lines of ant-code using macrodef. But its resulting in error like :

copy doesn't support the nested "my-macro" element. 

If I "inline" definition of my-macro of adding filterchian within copy-task it works.

My test target looks like this -

<target name="copy-files">
        <sequential>
            <copy todir="abc" >
                <fileset dir="xyz">
                    <!--needy includes/excludes -->
                </fileset>
                <my-macro/>
            </copy>
        </sequential>
 </target>

And my-macro looks like this:

 <macrodef name="my-macro">
        <sequential>
            <filterchain>
                <fixcrlf includes="**" eol="lf"/>
            </filterchain>
        </sequential>

    </macrodef>

Code which works (inlined-one ) looks like :

<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"/>

-- 編集 -- 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 (またはそれが依存する他のクラス) のコードです。

createFilterChainaddFilesetcreateMapperおよびその他の名前の Copy.java メソッドが表示されます。そのため、 Copy のマニュアル ページ<copy>に記載されている fileset、filterchain、mapper、およびその他のネストされた要素をサポートしています。

マクロ定義

これは、ネストされたタスクをテンプレートとして使用して新しいタスクを定義します。

Macrodef は、Java でコーディングせずに Ant タスクを定義する方法です。ネストされた Ant xml 行を、他の Ant タスクと同じように機能する新しいタスクに変換します。

明らかに、 Ant タスクではなくAnt タイプのように、単に<filterchain>inに入れるべきではありません。<macrodef><filterchain>

于 2014-05-07T10:53:23.280 に答える