2011-12-15 95 views
4

我有一個構建文件,它創建一個包含相同資源的tar和zip文件。從一組共享文件集中生成一個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的代碼,這解釋了爲什麼這會起作用)。

缺少的是定義一組歸檔文件集並重用它的方法。

使用pathunion無法成功組合歸檔文件集。在這種情況下,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> 

真的,我不認爲這是一個進步可言,因爲它是不是真的重新使用該文件集。

我唯一能想到的其他事情是爲「歸檔文件集集合」創建一個自定義typedef(編寫Java代碼),這個歸檔文件集可以在marcos中由id引用。但是如果涉及到這一點,我可能會只是在構建文件中使用重複。

有什麼更清潔,我失蹤?

我的要求是單獨使用Ant(不是ant-contrib或其他第三方擴展),但使用這些的答案可能對其他人有幫助。

回答

1

參見http://ant.apache.org/manual/using.html#references

任何項目元件可以被分配使用它的id屬性 的標識符。在大多數情況下,該元素隨後可以通過 來指定相同類型的元素上的refid屬性。如果您要一遍又一遍地複製相同的XML 片段,則此 可能會有用

+0

謝謝。我在do_tar塊中嘗試了這個` ...`,然後在do_zip塊中加入了這個```。它不起作用。因此,它仍然看起來像首先需要一組「文件集」容器,所以我可以通過設置ID來重新使用它。 – sudocode 2011-12-15 12:39:53

相關問題