套用

名稱 execon不建議使用,僅保留以維持向後相容性。

說明

執行系統命令。當指定 os 屬性時,命令僅在 Apache Ant 在其中一個指定作業系統上執行時才會執行。

多個 資源集合 的檔案和/或目錄(包括但不限於 檔案集目錄集自 Ant 1.6 起)或 檔案清單自 Ant 1.6 起))作為引數傳遞給系統命令。

如果您指定巢狀 對應器,每個來源檔案的時間戳記會與目標檔案的時間戳記進行比較,目標檔案由巢狀 mapper 元素定義,並在指定的 dest 中搜尋(如果已指定)。

至少需要一個 filesetfilelist,且不得指定多個 mapper

請注意,您無法與分岔程式互動,唯一可以傳送輸入的方式是透過 inputinputstring 屬性。

在類 Unix 系統上以背景程序執行 Ant

如果您以背景程序執行 Ant(例如 ant &),並使用 spawn 設定為 false<apply> 任務,您必須提供明確的輸入給分岔程序,否則 Ant 會暫停,因為它會嘗試從標準輸入讀取。

參數

屬性 說明 必要
executable 要執行的命令,不含任何命令列引數。
dest 執行命令時預期會放置目標檔案的目錄。 否;除非指定巢狀對應器,否則會忽略;預設情況下,對應器傳回的目標檔名會被解釋為絕對路徑
spawn 您是否要分岔命令。
如果您分岔命令,Ant 就不會記錄其輸出。
在分岔程序時,輸入、輸出、錯誤和結果屬性設定不會作用。
自 Ant 1.6 起
否;預設為 false
dir 應執行命令的目錄。 否;如果 vmlaunchertrue,則預設為目前工作目錄,否則為專案的 basedir
relative 檔名是否應作為相對路徑名稱傳遞給命令列(相對於來源檔案對應檔案集/清單的基本目錄或目標檔案的 dest 屬性)。 否;預設為 false
forwardslash 即使作業系統需要其他檔案分隔符號,檔案名稱是否應該使用正斜線傳遞。如果系統檔案分隔符號是正斜線,則會忽略此選項。 否;預設為 false
作業系統 可以執行命令的作業系統清單。
作業系統家族 <os> 條件中使用的作業系統家族。自 Ant 1.7 起
輸出 應該將命令輸出重新導向到的檔案。如果錯誤串流也沒有重新導向到檔案或屬性,它將出現在此輸出中。
錯誤 應該將命令標準錯誤重新導向到的檔案。自 Ant 1.6 起
記錄錯誤 當您希望在 Ant 的記錄中看到錯誤輸出,並且您正在將輸出重新導向到檔案/屬性時,會使用此屬性。錯誤輸出不會包含在輸出檔案/屬性中。如果您使用 errorerrorProperty 屬性重新導向錯誤,這將不會產生任何效果。自 Ant 1.6 起
附加 輸出是否應該附加到現有檔案或覆寫現有檔案。如果您將 parallel 設為 false,您可能會希望將此設為 true 否;預設為 false
輸出屬性 應該將命令輸出儲存在其中的屬性的名稱。除非錯誤串流重新導向到個別檔案或串流,否則此屬性將包含錯誤輸出。
錯誤屬性 應該將命令標準錯誤儲存在其中的屬性的名稱。自 Ant 1.6 起
輸入 執行命令的標準輸入取自的檔案。此屬性與 inputstring 屬性互斥。自 Ant 1.6 起
輸入字串 作為執行命令的輸入串流的字串。此屬性與 input 屬性互斥。自 Ant 1.6 起
結果屬性 應該將命令回傳碼儲存在其中的屬性的名稱。只有在 failonerrorfalse 時才有意義。如果您將 parallel 設為 false,則只會儲存第一次執行的結果。
逾時 如果命令未在指定時間內完成(以毫秒為單位),則停止命令。
發生錯誤時失敗 如果命令以 0 以外的回傳碼結束,則停止建置程序。 否;預設為 false
failifexecutionfails 如果無法啟動程式,則停止建置。 否;預設為 true
skipemptyfilesets 如果找不到原始檔案或原始檔案比對應的目標檔案新,則不執行命令。儘管名稱如此,此屬性也適用於檔案清單。 否;預設為 false
parallel 只執行一次命令,將所有檔案附加為引數。如果為 false,則會對每個檔案執行一次命令。 否;預設為 false
type filedirboth 之一。如果設定為 file,則只會將純文字檔案的名稱傳送至命令。如果設定為 dir,則只會考慮目錄的名稱。
注意type 屬性不適用於巢狀的 dirsetdirset 始終隱含地假設類型為 dir
否;預設為 file
newenvironment 當指定新的環境變數時,不傳播舊的環境。 否;預設為 false
vmlauncher 在有 JVM 執行設施時,使用 JVM 執行命令。如果設定為 false,則會使用基礎作業系統的殼層,直接或透過 antRun 腳本。在某些作業系統中,這會提供 JVM 通常無法提供的設施,包括在 Windows 中能夠執行腳本,而不是其關聯的直譯器。如果您想將可執行檔的名稱指定為 dir 屬性所提供的目錄的相對路徑,可能也需要將 vmlauncher 設定為 false 否;預設為 true
resolveExecutable 當此屬性為 true 時,可執行檔的名稱會先根據專案的 basedir 解析,如果不存在,則根據指定的執行目錄解析。在 Unix 系統中,如果您只想允許執行使用者路徑中的命令,請將此設定為 false自 Ant 1.6 起 否;預設為 false
maxparallel 限制並行處理量,一次傳遞最多這麼多個原始檔案。設定為負整數表示無限制。自 Ant 1.6 起 否,預設為無限制
addsourcefile 是否應自動將原始檔案名稱加入命令中。自 Ant 1.6 起 否;預設為 true
verbose 是否在執行後印出摘要。自 Ant 1.6 起 否;預設為 false
ignoremissing 是否忽略透過檔案清單指定的非存在檔案。自 Ant 1.6.2 起 否;預設為 true
force 是否略過目標檔案的時間戳記比較。自 Ant 1.6.3 起 否;預設為 false
discardOutput 是否應完全捨棄輸出。此設定與任何將輸出重新導向至檔案或屬性的設定不相容。
如果您將此設定為 true,錯誤輸出也會被捨棄,除非您將錯誤輸出重新導向至檔案、屬性或啟用 logError自 Ant 1.10.10 起
否;預設為 false
discardError 是否應完全捨棄錯誤輸出。此設定與任何將錯誤輸出重新導向至檔案或屬性的設定,以及 logError 不相容。自 Ant 1.10.10 起 否;預設為 false

以嵌套元素指定的參數

fileset

您可以使用任意數量的嵌套 <fileset> 元素來定義此任務的檔案,並參考在其他地方定義的 <fileset>

filelist

自 Ant 1.6 起

您可以使用任意數量的嵌套 <filelist> 元素來定義此任務的檔案,並參考在其他地方定義的 <filelist>

dirset

自 Ant 1.6 起

您可以使用任意數量的嵌套 <dirset> 元素來定義此任務的目錄,並參考在其他地方定義的 <dirset>

任何其他 資源集合

自 Ant 1.7 起

您可以使用任意數量的嵌套資源集合。

mapper

單一 <mapper> 指定相對於 dest 屬性的目標檔案,以進行相依性檢查。如果指定 dest 屬性,它將用作解析由對應器傳回的相對路徑名稱的基本目錄。至少需要一個 <fileset><filelist>

arg

命令列引數應指定為嵌套 <arg> 元素。請參閱 命令列引數

srcfile

預設情況下,來源檔案的檔案名稱將新增至命令列的結尾(除非您將 addsourcefile 設定為 false)。如果您需要將其放在其他位置,請在 <arg> 元素之間使用嵌套 <srcfile> 元素來標記插入點。

屬性 說明 必要
prefix 在建立命令列引數時,置於檔案名稱前面的前置詞。自 Ant 1.8.0 起
字尾 在建立命令列參數時附加到檔案名稱的字尾。自 Ant 1.8.0 起

目標檔案

<targetfile> 類似於 <srcfile>,並標示命令列上目標檔名的位置。如果省略,目標檔名將不會新增到命令列中。只有在您也定義巢狀映射器時,才能指定此元素。

屬性 說明 必要
prefix 在建立命令列引數時,置於檔案名稱前面的前置詞。自 Ant 1.8.0 起
字尾 在建立命令列參數時附加到檔案名稱的字尾。自 Ant 1.8.0 起

環境

可以透過巢狀 <env> 元素指定要傳遞給系統命令的環境變數。請參閱 exec 部分中的說明

重新導向器

自 Ant 1.6.2 起

可以指定巢狀 I/O 重新導向器。<apply> 的行為類似於 exec 在重新導向器方面的行為,但例外的是,在非 parallel 模式中,檔案對應會在每次反覆運算時執行。這讓使用者能夠針對每個來源檔案接收輸入和傳送輸出到不同的檔案。

parallel 模式中,重新導向器將針對每批執行 (其中 maxparallel > 0) 重設,且 null 將用作來源檔案,就像在 exec 的情況一樣。

範例

呼叫 ls -l,將所有檔案的絕對檔名新增到 /tmp 下方,結尾不是 .txt,以及所有具有 id other.files 的 FileSet 檔案新增到命令列。

<apply executable="ls">
  <arg value="-l"/>
  <fileset dir="/tmp">
    <patternset>
      <exclude name="**/*.txt"/>
    </patternset>
  </fileset>
  <fileset refid="other.files"/>
</apply>

針對 /tmp 中的每個檔案呼叫 somecommand arg1 SOURCEFILENAME arg2,將 SOURCEFILENAME 取代為每個檔案的絕對檔名。如果 parallel 已設定為 trueSOURCEFILENAME 將會取而代之為所有檔案的絕對檔名,並以空白分隔。

<apply executable="somecommand" parallel="false">
  <arg value="arg1"/>
  <srcfile/>
  <arg value="arg2"/>
  <fileset dir="/tmp"/>
</apply>

針對每個比對應 .o 更新的 .c 檔案呼叫 cc -c -o TARGETFILE SOURCEFILE,將 TARGETFILE 取代為 .o 的絕對檔名,並將 SOURCEFILE 取代為 .c 檔案的絕對名稱。

<apply executable="cc" dest="src/C" parallel="false">
  <arg value="-c"/>
  <arg value="-o"/>
  <targetfile/>
  <srcfile/>
  <fileset dir="src/C" includes="*.c"/>
  <mapper type="glob" from="*.c" to="*.o"/>
</apply>

將虛構的 processfile 可執行檔套用至 src 目錄中所有符合 *.file 的檔案。<mapper>out 已設定為將 *.file 對應到 *.out,然後此 <mapper> 用於指定此 <apply> 任務的 targetfile。然後,對 out 的參考用作巢狀於 <redirector> 中的 <outputmapper>,而 <redirector> 又巢狀於此 <apply> 執行個體下方。這讓我們能夠針對輸出檔案執行相依性檢查,在本例中為目標檔案。

<mapper id="out" type="glob"
           from="src${file.separator}*.file"
           to="dest${file.separator}*.out"/>

<apply executable="processfile" dest="dest">
  <fileset dir="src" includes="*.file"/>
  <mapper refid="out"/>
  <redirector>
    <outputmapper refid="out"/>
  </redirector>
</apply>

ls 可執行檔套用至 PATH 中的所有目錄,有效列出 PATH 中可用的所有可執行檔。

<apply executable="ls" parallel="true"
       force="true" dest="${basedir}" append="true" type="both">
  <path>
    <pathelement path="${env.PATH}"/>
  </path>
  <identitymapper/>
</apply>

使用命令 jsmin < src/a.js > dest/a.js 轉換 src 目錄中的所有 JavaScript 檔案。由於檔案名稱本身不應傳遞給 jsmin 程式,因此 addsourcefile 設為 false

<apply executable="jsmin" addsourcefile="false">
    <!-- Collect the JS-files -->
    <fileset dir="src" includes="*.js"/>
    <redirector>
        <!-- redirect STDIN; fileset collects relative to its dir, but we need -->
        <!-- relative to basedir -->
        <inputmapper type="glob" from="*" to="src/*"/>
        <!-- redirect STDOUT to file in dest-dir -->
        <outputmapper id="out" type="glob" from="*.js" to="dest/*.js"/>
    </redirector>
</apply>