ant tar任务:启用“tar append”的程序

时间:2011-08-30 14:50:50

标签: ant tar

目标:使用ant为任意组合创建单个tar存档 (例如)5个文件夹(所有文件夹,或任何3个文件夹或任何4个文件夹) ...)。我不喜欢使用临时目录和复制命令。

如果ant tar任务支持append,这应该很简单。

搜索引导我:

  

压缩antlib的tar任务中的设置模式=“更新”应该执行请求。

来自:https://issues.apache.org/bugzilla/show_bug.cgi?id=39617

我如何知道是否安装了'antlib',或者我如何安装 它。如何设置mode =“update” - 哪个文件是chgd?。

在ant的tar任务中启用“tar append”的最佳方法是什么?

除非tar文件已存在,否则GNU tar -r或-u选项会失败 - 关于如何处理蚂蚁的任何想法?

--

感谢

PS

以下示例是一个解析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} ]] &amp;&amp; C=r || C=c;
        tar ${C}vf ${tarfile} --exclude '*/.svn' ${src}/main/blah
      "/>
  </exec>
</target>

我不想使用上述方法,但它确实有效。

2 个答案:

答案 0 :(得分:1)

使用Compress Antlib需要两个项目:

  • Compress Antlib本身,可以找到here 如果你已经拥有它,它可能被命名为 ant-compress-1.0.jar
  • Apache Commons Compress,可以找到here 如果你有这个,可能会被称为 commons-compress-1.2.jar

您可以选择使用Ant安装来安装这些,但也许可以将它们整合到您的构建中。

这是一个使用这两个下载的Ant构建文件示例,它们放置在构建的basedir下的名为external的目录中。这将使用目录my.tar中的文件创建dir_one,然后使用从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 task的更多选项,请参阅超类ArchiveBase

答案 1 :(得分:0)

为什么不首先创建包含多个源文件夹的存档,而不是更新现有存档?

<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>