Tar

描述

创建 tar 归档文件。

basedir 属性是用于 tar 的参考目录。

此任务是 基于目录的任务,因此它形成一个隐式的 Fileset。这定义了相对于 basedir 的哪些文件将包含在归档文件中。tar 任务支持 Fileset 的所有属性,以细化要包含在隐式 fileset 中的文件集。

除了隐式 fileset 之外,tar 任务还支持嵌套资源集合和一种特殊形式的 fileset。这些 fileset 被扩展以允许控制应用于 tar 条目的访问模式、用户名和组名。例如,当为 Unix 系统准备归档文件时,这很有用,其中一些文件需要具有执行权限。默认情况下,此任务将使用 644 的 Unix 权限用于文件,755 的 Unix 权限用于目录。

早期版本的 tar 实用程序不支持超过 100 个字符的路径。随着时间的推移,开发了许多不兼容的扩展,直到创建了一个新的 POSIX 标准,该标准添加了所谓的 PAX 扩展头(因为 pax 实用程序首先引入了它们),这些扩展头在其他方面解决了超过 100 个字符的文件名。所有现代版本的 tar 都支持 PAX 扩展头。

Ant 的 tar 支持早于使用 PAX 扩展头的标准,它支持不同的方言,可以使用 longfile 属性启用。如果 longfile 属性设置为 fail,任何长路径都会导致 tar 任务失败。如果 longfile 属性设置为 truncate,任何长路径都会在添加到归档文件之前被截断为 100 个字符的最大长度。如果 longfile 属性的值设置为 omit,则包含长路径的文件将从归档文件中省略。任一选项都确保归档文件可以被任何符合标准的 tar 版本解压缩。

如果路径或文件信息的丢失是不可接受的(这种情况很少见),则可以将 longfile 设置为 gnuposix。使用 posix,Ant 将添加 PAX 扩展头,使用 gnu,它将添加 GNU tar 特定的扩展,更新版本的 GNU tar 称为 oldgnu。GNU tar 仍然默认创建这些扩展,但也支持 PAX 扩展头。任一选择都将生成一个 tar 文件,该文件可以具有任意长度的路径。但是请注意,生成的归档文件只能使用支持所选格式的 tar 工具解压缩。

longfile 属性的默认值为 warn,其行为与 gnu 选项相同,只是它会为遇到的每个不符合限制的文件路径生成警告。出于向后兼容性的原因,它使用 gnu 而不是 posix

为了实现最佳互操作性,您应该为 longfile 属性使用 failposix

此任务可以通过将 compression 属性设置为 gzipbzip2xz 来执行压缩。

参数

属性 描述 必需
destfile 要创建的 tar 文件。
basedir 用于 tar 文件的目录。
longfile 确定如何处理长文件名(> 100 个字符)。允许的值为 truncatefailwarnomitgnuposix 否;默认值为 warn
includes 必须包含的文件模式的逗号或空格分隔列表。 否;默认值为全部 (**)
includesfile 文件名称。此文件的每一行都被视为一个包含模式
excludes 必须排除的文件模式的逗号或空格分隔列表。 否;默认值为默认排除项,如果 defaultexcludesno,则为无
excludesfile 文件名称。此文件的每一行都被视为一个排除模式
defaultexcludes 指示是否应使用默认排除项 (yes|no)。 否;默认值为 yes
compression 压缩方法。允许的值为 nonegzipxzbzip2 否;默认值为 none
encoding 用于 tar 文件中文件名的字符编码。有关可能值的列表,请参阅 支持的编码。通常,tar 格式期望名称使用单字节编码,在此处指定多字节编码可能会导致无法被我的 tar 工具正确提取的归档文件。
自 Ant 1.9.5 起
否;默认值为默认 JVM 字符编码

作为嵌套元素指定的参数

此任务支持嵌套的 tarfileset 元素。这些是扩展的 FileSets,除了标准元素之外,还支持一个额外的属性

属性 描述 必需
preserveLeadingSlashes 指示是否应在文件名中保留前导 / 否;默认值为 false

任何其他资源集合

资源集合 用于选择要归档的文件组。

在 Apache Ant 1.7 之前,仅支持 <fileset> 作为嵌套元素。

示例

htdocs/manual 目录中的所有文件 tar 到 ${dist} 目录中的名为 manual.tar 的文件中,然后应用 gzip 任务对其进行压缩。

<tar destfile="${dist}/manual.tar" basedir="htdocs/manual"/>
<gzip destfile="${dist}/manual.tar.gz" src="${dist}/manual.tar"/>

htdocs/manual 目录中的所有文件 tar 到 ${dist} 目录中的名为 manual.tar 的文件中。排除 mydocs 目录中的文件或名为 todo.html 的文件。

<tar destfile="${dist}/manual.tar"
     basedir="htdocs/manual"
     excludes="mydocs/**, **/todo.html"/>

将文件 docs/readme.txt 作为 /usr/doc/ant/README 写入归档文件。docs 目录中的所有 *.html 文件都以 /usr/doc/ant 为前缀,因此例如 docs/index.html 被写入 /usr/doc/ant/index.html 到归档文件。

<tar destfile="${basedir}/docs.tar">
  <tarfileset dir="${dir.src}/docs"
              fullpath="/usr/doc/ant/README"
              preserveLeadingSlashes="true">
    <include name="readme.txt"/>
  </tarfileset>
  <tarfileset dir="${dir.src}/docs"
              prefix="/usr/doc/ant"
              preserveLeadingSlashes="true">
    <include name="*.html"/>
  </tarfileset>
</tar>

构建一个 tar 文件,该文件使用 GNU 扩展来处理长路径,其中一些文件需要被标记为可执行文件(模式 755),而其他文件使用默认模式(所有者可读写)。第一个 fileset 只选择可执行文件。第二个 fileset 必须排除可执行文件并包含所有其他文件。

<tar longfile="gnu"
     destfile="${dist.base}/${dist.name}-src.tar">
  <tarfileset dir="${dist.name}/.." filemode="755" username="ant" group="ant">
    <include name="${dist.name}/bootstrap.sh"/>
    <include name="${dist.name}/build.sh"/>
  </tarfileset>
  <tarfileset dir="${dist.name}/.." username="ant" group="ant">
    <include name="${dist.name}/**"/>
    <exclude name="${dist.name}/bootstrap.sh"/>
    <exclude name="${dist.name}/build.sh"/>
  </tarfileset>
</tar>

注意tar 任务不确保文件只被一个资源集合选择。如果同一个文件被多个集合选择,它将被包含在 tar 文件中两次,路径相同。

注意includeexclude 元素中的模式被认为是相对于相应的 dir 属性的,与所有其他 fileset 相同。在上面的示例中,${dist.name} 不是绝对路径,而是一个目录的简单名称,因此 ${dist.name} 是相对于 ${dist.name}/.. 的有效路径。

将 ZIP 归档文件重新打包为 GZip 压缩的 tar 归档文件。如果 Unix 文件权限已作为 ZIP 文件的一部分存储,它们将保留在生成的 tar 归档文件中。

<tar destfile="release.tar.gz" compression="gzip">
  <zipfileset src="release.zip"/>
</tar>

注意:请注意,tar 任务创建了一个 tar 文件,它不会追加到现有的 tar 文件。现有的 tar 文件将被替换。与 Ant 中的大多数任务一样,此任务只有在输出文件(在本例中为 tar 文件)比输入文件旧或输出文件不存在时才会执行操作。