目标:使用ant为任何组合创建单个tar存档(比如)5个文件夹(所有文件夹,或任何3个文件夹或任何4个文件夹)……)。我不喜欢使用临时目录和复制命令。
如果ant tar任务支持追加,这应该很简单。
搜索到:
在压缩antlib的tar任务中设置mode="update"应该执行请求。
从:https://issues.apache.org/bugzilla/show_bug.cgi?id=39617
我如何知道'antlib'是否已安装,或者我如何安装它。如何设置mode="update" -哪个文件是chgd?
在ant的tar任务中启用"tar追加"的最好方法是什么?
GNU tar -r或-u选项失败,除非tar文件已经存在有什么办法可以解决吗?
--
感谢p>
面的例子是一个绕过fork shell,然后检查到查看tarfile是否存在,如果存在则运行tar w/append选项:<target name="package-blah" description="generate tar file" depends="clean,init">
<exec executable="sh" >
<arg value="-xc"/>
<arg value="
[[ -f ${tarfile} ]] && C=r || C=c;
tar ${C}vf ${tarfile} --exclude '*/.svn' ${src}/main/blah
"/>
</exec>
</target>
我宁愿不使用上面的方法,但它是有效的。
使用Compress Antlib需要两个条件:
- 压缩Antlib本身,可以在这里找到
如果你已经有这个文件,可能会命名为ant-compress-1.0.jar。 - Apache Commons Compress,可以在这里找到。
如果你有这个,它很可能被称为commons-compress-1.2.jar.
您可以选择在您的Ant安装中安装它们,但也许将它们包含在您的构建中会更简洁。
下面是一个示例Ant构建文件,它使用了这两个下载文件,并将它们放在basedir下名为external
的目录中用于构建。这将使用目录dir_one
中的文件创建my.tar
,然后使用从dir_two
添加的文件更新该tar。
<project basedir="." xmlns:compress="antlib:org.apache.ant.compress">
<taskdef uri="antlib:org.apache.ant.compress"
resource="org/apache/ant/compress/antlib.xml"
classpath="external/ant-compress-1.0.jar:external/commons-compress-1.2.jar"/>
<delete file="my.tar" />
<compress:tar dest="my.tar" mode="update">
<fileset dir="dir_one" includes="*.txt" />
</compress:tar>
<compress:tar dest="my.tar" mode="update">
<fileset dir="dir_two" includes="*.txt" />
</compress:tar>
</project>
注意使用名称空间来消除与标准Ant tar
任务的歧义。需要taskdef
来使Ant意识到Antlib。
以这种方式合并时要小心-如果合并同名的文件可能会出现奇怪的事情。请注意,在幕后,Commons Compress会创建一个存档的临时副本,所以这并不能避免,它只是为你做了。
如果您想探索tar任务的更多选项,请参阅超类ArchiveBase。
与其更新现有的存档,为什么不首先使用多个源文件夹创建存档呢?
<tar destfile="${target}/mytar.tar">
<tarfileset dir="srcdir1">
<include name="**/*" />
<exclude name="**/*.sh" />
</tarfileset>
<tarfileset dir="srcdir2">
<include name="**/*.sh" />
</tarfileset>
<tarfileset dir="srcdir3">
<include name="**/*" />
</tarfileset>
</tar>