2011-12-15 16 views
4

同じリソースを含むtarとzipを作成するビルドファイルがあります。共有ファイルセットからタールとジップを構築する

<tar destfile="my.tar.gz" compression="gzip"> 
    <tarfileset dir="somedir" prefix="some_prefix" filemode="xxx"> 
    <include name="some_pattern"/> 
    </tarfileset> 
    <!-- other tarfilesets ... --> 
</tar> 

<zip destfile="my.zip"> 
    <zipfileset dir="somedir" prefix="some_prefix" filemode="xxx"> 
    <include name="some_pattern"/> 
    </zipfileset> 
    <!-- other zipfilesets ... --> 
</tar> 

アーカイブには多くのファイルセットがあります。

私は重複を除外することを好むでしょう - 何とかファイルセットを一度定義し、それらを再利用してtarとzipの両方をビルドします。

TarFileSetZipFileSetは非常に似ています(どちらもArchiveFileSetを拡張しています)。私はzipfilesetsからtarとzipを構築することを実験しました。これは機能します。 TarFileSetに固有の機能が必要ない限り、少なくとも、 (私はTarFileSetのソースも見て、ArchiveFilesetをTarFileSetに変換するコードがあるのを見て、これがなぜ機能するのか説明しています)。

アーカイブファイルセットのセットを定義して再利用する方法がありません。

またはunionを使用してアーカイブファイルセットを正常に結合することはできません。この場合、ArchiveFileSetの余分な属性(例えば、プレフィックス)は破棄される。 (PatternSetを使用すると、まったく動作しません。)

だから私は今のところ出ている最高のはこれです:

<project default="test"> 

    <target name="test"> 

    <zipfileset dir="test/1" filemode="755" prefix="test1" id="test1"/> 
    <zipfileset dir="test/2" filemode="755" prefix="test2" id="test2"/> 

    <do_tar destfile="test.tar.gz"> 
     <filesets> 
     <zipfileset refid="test1"/> 
     <zipfileset refid="test2"/> 
     </filesets> 
    </do_tar> 

    <do_zip destfile="test.zip"> 
     <filesets> 
     <zipfileset refid="test1"/> 
     <zipfileset refid="test2"/> 
     </filesets> 
    </do_zip> 

    </target> 

    <macrodef name="do_tar"> 
    <attribute name="destfile"/> 
    <attribute name="compression" default="gzip"/> 
    <element name="filesets"/> 
    <sequential> 
     <tar destfile="@{destfile}" compression="@{compression}"> 
     <filesets/> 
     </tar> 
    </sequential> 
    </macrodef> 

    <macrodef name="do_zip"> 
    <attribute name="destfile"/> 
    <element name="filesets"/> 
    <sequential> 
     <zip destfile="@{destfile}"> 
     <filesets/> 
     </zip> 
    </sequential> 
    </macrodef> 

</project> 

そして、本当に、私はそれがあるので、それがすべてで改善だとは思いません実際にはファイルセットを再使用していません。

私が考えることができる唯一のものは、マルコスのidによって参照される「アーカイブファイルセットのセット」のカスタム型定義(Javaコードの記述)を作成することです。しかし、それになるならば、私はたぶん、ビルドファイルに重複して暮らしています。

私が紛失しているクリーナーはありますか?

私の要件は、Antのみ(ant-contribや他のサードパーティの拡張ではありません)を使用することですが、これらを使用する回答は他の人にとって役に立ちます。

答えて

1

http://ant.apache.org/manual/using.html#referencesを参照してください:

任意のプロジェクト要素はそのID 属性を使用して識別子を割り当てることができます。ほとんどの場合、要素は同じタイプの要素のrefid属性を指定することによって、後で によって参照されます。この は、同じXMLスニペットを繰り返し複製する場合に便利です

+0

ありがとうございました。私はこの ' ...'をdo_tarブロックで試してから、do_zipブロックのこの ''を続けてみました。それは動作しません。ですから、最初は "ファイルセットのセット"の必要性のように見えますので、idを設定して再利用することができます。 – sudocode

+0

あなたはおそらく組合を探しています:http://ant.apache.org/manual/Types/resources.html#union –

+0

いい考えです。残念ながら、この動作はパスを使用する場合と同じように見えます。非基本ファイルセットの属性(プレフィックスなど)は破棄されます。組合のバグとみなされるかもしれない。 – sudocode

関連する問題