Ant

說明

在提供的建置檔案上執行 Apache Ant。這可以用來建置子專案。如果此任務呼叫它所屬的建置檔案,則不可在 target 外部使用此任務。

當省略 antfile 屬性時,會使用提供的目錄 (dir 屬性) 中的 build.xml 檔案。

如果未提供 target 屬性,則會使用新專案的預設目標。

預設情況下,目前專案的所有屬性都可以在新專案中使用。或者,您可以將 inheritAll 屬性設定為 false,則只有「使用者」屬性 (即命令列中傳遞的屬性) 會傳遞到新專案。在任一種情況下,傳遞到新專案的屬性集合都會覆寫在新專案中設定的屬性 (另請參閱 property 任務)。

您也可以使用巢狀 property 標籤,從舊專案在新專案中設定屬性。這些屬性始終傳遞到新專案和在該專案中建立的任何專案,而不管 inheritAll 的設定為何。這允許您參數化您的子專案。

當多個巢狀 <property> 元素設定同一個名稱的屬性時,最後宣告的元素會獲勝。這是為了向後相容性,即使它與建置檔案中的 <property> 任務行為不同。

在命令列上定義的屬性不能被巢狀 <property> 元素覆寫。從 Ant 1.8.0 開始<ant> 任務的巢狀結構也是如此:如果建置檔案 A 透過 <ant> 任務呼叫 B,並使用巢狀 <property> 元素設定屬性,而 B 包含呼叫 C<ant> 任務,則 C 會看到在 A 中設定的值,即使 B 也使用了巢狀 <property> 元素。

資料類型的參考也可以傳遞到新專案,但預設情況下不會傳遞。如果您將 inheritrefs 屬性設定為 true,則會複製所有參考,但它們不會覆寫在新專案中定義的參考。

巢狀 <reference> 元素也可以用於將參考從呼叫專案複製到新專案,也可以在不同的 id 下複製。從巢狀元素取得的參考會覆寫在新專案中目標外部定義的現有參考,但不會覆寫在目標內部定義的參考。

參數

屬性 說明 必要
antfile 要使用的建置檔案。此檔案預期是相對於所提供的 dir 屬性的檔案名稱。 否;預設為 build.xml
dir 要作為新 Ant 專案的 basedir 的目錄(除非 useNativeBasedir 設為 true)。這會覆寫所呼叫專案的 basedir 設定。
同時作為解析 antfileoutput 屬性值(如果有)的目錄。
否;預設為目前專案的 basedir,除非 inheritall 已設為 false,否則它沒有預設值
target 應執行的新 Ant 專案目標。 否;預設為新專案的預設目標
output 要將 Ant 輸出寫入的檔案名稱。如果已設定 dir 屬性,則這是相對於其值,否則相對於目前專案的 basedir
inheritAll 如果為 true,將所有屬性傳遞給新 Ant 專案。 否;預設為 true
inheritRefs 如果為 true,將所有參照傳遞給新 Ant 專案。 否;預設為 false
useNativeBasedir 如果設為 true,子建置會使用與從命令列執行時相同的 basedir(即從子建置的建置檔中查看時會預期的 basedir)。自 Ant 1.8.0 起 否;預設為 false

指定為巢狀元素的參數

property

請參閱 property 工作的說明。
這些屬性等同於您在命令列中定義的屬性。這些是特殊屬性,它們會永遠傳遞,即使透過其他 inheritAll 設為 false<*ant*> 工作(請參閱上方)。
請注意,refid 屬性指向呼叫專案中的參照,而不是新專案中的參照。

reference

用於選擇要複製到新專案中的參照,並選擇性變更其 id

屬性 說明 必要
refid 呼叫專案中參照的 id
torefid 新專案中參照的 id 否;預設為 refid 的值

propertyset

自 Ant 1.6 起.

您可以使用 propertyset 指定要複製到新專案中的一組屬性。

target

自 Ant 1.6.3 起.

您可以使用巢狀 <target> 元素指定多個目標,而不是使用 target 屬性。這些目標會執行,就像 Ant 已呼叫單一目標,而其相依性是如此指定的目標,並按照指定的順序。

屬性 說明 必要
名稱 呼叫目標的名稱。

新專案的 Basedir

如果您將 useNativeBasedir 設定為 true,新專案的 basedir 將會是新專案的 <project> 元素的 basedir 屬性所指定的內容(或如果沒有 basedir 屬性,則為新專案的目錄),無論此工作任務的其他任何屬性如何指定,以及此工作任務在 <ant> 呼叫層級中有多深。

如果您尚未設定 useNativeBasedir 或將其設定為 false,則套用下列規則

新專案的 basedir 值會受到兩個屬性(dirinheritall)以及 <ant> 工作任務的歷程記錄影響。目前已知的行為令人困惑,但無法在不破壞向後相容性的情況下進行變更。

如果 <ant> 工作任務位於「頂層」建置檔案中,亦即包含 <ant> 工作任務的專案本身並未作為不同 <ant>(或 <antcall>)工作任務的一部分在「較上層」呼叫,則下表顯示詳細資訊

dir 屬性 inheritAll 屬性 新專案的 basedir
提供的數值 true dir 屬性的數值
提供的數值 false dir 屬性的數值
省略 true 呼叫專案的 basedir(其建置檔案包含 <ant> 工作任務)。
省略 false 新專案的 <project> 元素的 basedir 屬性

另一方面,如果 <ant> 工作任務已經巢狀到另一個呼叫中,則父呼叫的設定會影響 basedir 值的結果。目前工作任務的 dir 屬性永遠會優先,但如果已省略 dir 屬性,則會產生更複雜的情況

dir 屬性 inheritAll 屬性 目前 inheritAll 屬性 新專案的 basedir
提供的數值 任何 任何 dir 屬性的數值
省略 true true 父專案的 basedir(其建置檔案呼叫包含目前 <ant> 工作任務的建置檔案)。
省略 true false 父專案的 basedir(其建置檔案呼叫包含目前 <ant> 工作任務的建置檔案)。
省略 false true 呼叫專案的 basedir(其建置檔案包含目前 <ant> 工作任務)。
省略 false false 新專案的 <project> 元素的 basedir 屬性

如果您加入更深的巢狀層級,情況會變得更複雜,您需要遞迴套用上表。

如果最外層建置的 basedir 已在命令列上指定為屬性(亦即 -Dbasedir=some-value-propertyfile 參數),則提供的數值會獲得更高的優先權。對於任何未指定 dir 屬性的 <ant> 工作任務,新專案的 basedir 將會是命令列上指定的數值,無論工作任務在建置檔案層級中有多深。

如果將 basedir 指定為 <ant> 任務的巢狀 <property>,也會發生相同的情況。在較深層級啟動的建置檔案的 basedir 會設定為屬性元素指定的值,除非對應的 Ant 任務明確設定 dir 屬性。

範例

以下是使用任務的不同方式

<ant antfile="subproject/subbuild.xml" target="compile"/>

<ant dir="subproject"/>

<ant antfile="subproject/property_based_subbuild.xml">
  <property name="param1" value="version 1.x"/>
  <property file="config/subproject/default.properties"/>
</ant>

<ant inheritAll="false" antfile="subproject/subbuild.xml">
  <property name="output.type" value="html"/>
</ant>

這些行呼叫相同的建置檔案

<ant antfile="sub1/sub2/build.xml"/>
<ant antfile="sub2/build.xml" dir="sub1"/>
<ant antfile="build.xml" dir="sub1/sub2"/>

呼叫專案的建置檔案定義了一些 <path> 元素,如下所示

<path id="path1">
    ...
</path>
<path id="path2">
    ...
</path>

而被呼叫的建置檔案 (subbuild.xml) 也定義了一個 idpath1<path>,但未定義 path2;然後

<ant antfile="subbuild.xml" inheritrefs="true"/>

不會覆寫 subbuildpath1 的定義,但會讓父項目的 path2 定義在 subbuild 中可用,而

<ant antfile="subbuild.xml"/>

以及

<ant antfile="subbuild.xml" inheritrefs="false"/>

既不會覆寫 path1,也不會複製 path2,而

<ant antfile="subbuild.xml" inheritrefs="false">
  <reference refid="path1"/>
</ant>

會覆寫 subbuildpath1 的定義,且

<ant antfile="subbuild.xml" inheritrefs="false">
  <reference refid="path1" torefid="path2"/>
</ant>

會使用 id path2 將父項目的 path1 定義複製到新的專案中。