2011-12-15 102 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

相关问题