Tar

說明

建立 tar 檔案。

basedir 屬性是 tar 的參考目錄。

此任務是 基於目錄的任務,因此會形成一個隱含的 檔案集。這會定義哪些檔案(相對於 basedir)會包含在檔案中。tar 任務支援所有 Fileset 的屬性,以調整要包含在隱含檔案集中的檔案集。

除了隱含的檔案集之外,tar 任務還支援巢狀資源集合和特殊形式的檔案集。這些檔案集已擴充,以允許控制要套用至 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 目錄中的所有檔案封存成 ${dist} 目錄中的 manual.tar 檔案,然後套用 gzip 任務來壓縮檔案。

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

htdocs/manual 目錄中的所有檔案封存成 ${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),其餘檔案則使用預設模式(由擁有者讀寫)。第一個檔案集僅選取可執行檔。第二個檔案集必須排除可執行檔並包含所有其他檔案。

<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 屬性,如同所有其他檔案集。在上述範例中,${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 檔案)比輸入檔案舊,或如果輸出檔案不存在,任務才會執行動作。