2013-04-08 79 views
7

只有在條件爲真的情況下,我纔會調用目標backup.yes。Ant目標調用

<condition property="directory.found.yes"> 
<equals arg1="${directory.found}" arg2="true"/> 
</condition> 

<antcall target="update.backup"/> 

有沒有辦法做到這一點。

+0

你可以擴大一點嗎?它可以完成,但是你的問題並不清楚 - 你在問題中提到'backup.yes',但不在示例代碼中。 – 2013-04-08 11:29:09

回答

6

你可以做以下

其他目標:

<antcall target="update.back"> 
    <param name="ok" value="${directory.found.yes}"/> 
</antcall> 

而在update.backup目標:

<target name="update.backup" if="ok"> 

但我認爲你也可以使用ant-contribif statement執行以下操作:

<if> 
    <equals arg1="${directory.found.yes}" arg2="true" /> 
    <then> 
      <antcall target="update.back" /> 
    </then>  
</if> 
10

相反的<antcall/>,請執行下列操作:

想象一下你調用目標foo,你想之前做一個備份,但只有當條件存在:

<target name="foo" 
    depends="update.backup"> 
    <..../> 
</target> 

<target name="update.backup.test"> 
    <condition property="directory.found.yes"> 
     <equals arg1="${directory.found}" arg2="true"/> 
    </condition> 
</target> 

<target name="update.backup" 
    depends="update.backup.test" 
    if="directory.found.yes"> 
    <.../> 
</target> 

<antcall/>的問題在於它在Ant依賴矩陣使用被破壞時使用,它用於強制任務在另一個任務完成之前完成。當真正被濫用時,你最終會多次調用同一個任務。我在這裏有一個項目,每個目標在10到14次之間,並且有超過二十個目標。我重寫了整個版本s <antcall/>,並使用真正的依賴設置,將構建時間減少了75%。

根據我的經驗,<antcall/>的90%是由於目標依賴管理較差。

假設您要執行目標foo。 (用戶想要真正執行的目標),並且在調用foo之前,您需要執行備份,但前提是該目錄實際存在。

在上面,foo被調用。這取決於update.backaup。目標update.backup被調用,但它取決於update.backup.test這將測試目錄是否實際存在。

如果該目錄存在,則update.backup任務中的if子句爲true,並且該任務將實際執行。否則,如果該目錄不存在,它將不會執行。

注意update.backup首先調用之前它會檢查該target實體ifunless參數屬性是否被選中的任何相關。這允許目標在嘗試執行之前調用一個測試。

這不僅僅是一個副作用,而是內置於Ant的設計中。事實上,螞蟻手冊上的目標(http://ant.apache.org/manual/targets.html)明確給出了一個非常類似的例子:

<target name="myTarget" depends="myTarget.check" if="myTarget.run"> 
    <echo>Files foo.txt and bar.txt are present.</echo> 
</target> 

<target name="myTarget.check"> 
    <condition property="myTarget.run"> 
     <and> 
      <available file="foo.txt"/> 
      <available file="bar.txt"/> 
     </and> 
    </condition> 
</target> 

,並指出:

重要:if和unless屬性只啓用或禁用目標他們所附的。它們不控制目標是否依賴於條件目標執行。事實上,他們甚至在目標即將被執行之前都不會被評估,並且其所有前任都已經運行。

+3

+1 antcall應該不惜一切代價避免 - 打開一個新的項目範圍,打破流程(取決於被調用目標的對象也會被調用..),屬性不會被傳遞迴調用目標。這是邪惡的根源,維護這樣的腳本是PITA。最後antcall不再需要ant> = 1.6 =>使用macrodef來代替。 – Rebse 2013-04-08 21:29:21