我有一个构建文件,它创建一个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。
TarFileSet和ZipFileSet非常相似(都扩展了ArchiveFileSet)。我尝试从zipfilesets构建tar和zip。这有效。至少,只要您不需要特定于TarFileSet的功能。 (我还查看了TarFileSet的源代码,看到它有代码将ArchiveFileset转换为TarFileSet,这解释了为什么会这样做。)
缺少的是一种定义一组存档文件集并重用它的方法。
您无法使用path或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>
实际上,我认为这根本不是一种改进,因为它不是真的重用文件集。
我能想到的唯一另一件事是为“一组归档文件集”创建一个自定义typedef(编写Java代码),这将由marcos中的id引用。但是如果涉及到这一点,我可能只会在构建文件中使用重复版本。
有什么东西比我更缺净吗?
我的要求是单独使用Ant(不是ant-contrib或其他第三方扩展),但使用这些扩展的答案可能对其他人有用。
答案 0 :(得分:1)
请参阅http://ant.apache.org/manual/using.html#references:
可以使用其id为任何项目元素分配标识符 属性。在大多数情况下,元素随后可以被引用 在同一类型的元素上指定refid属性。这个 如果要复制相同的XML片段,则可能很有用 一遍又一遍