只有在條件爲真的情況下,我纔會調用目標backup.yes。Ant目標調用
<condition property="directory.found.yes">
<equals arg1="${directory.found}" arg2="true"/>
</condition>
<antcall target="update.backup"/>
有沒有辦法做到這一點。
只有在條件爲真的情況下,我纔會調用目標backup.yes。Ant目標調用
<condition property="directory.found.yes">
<equals arg1="${directory.found}" arg2="true"/>
</condition>
<antcall target="update.backup"/>
有沒有辦法做到這一點。
你可以做以下
其他目標:
<antcall target="update.back">
<param name="ok" value="${directory.found.yes}"/>
</antcall>
而在update.backup目標:
<target name="update.backup" if="ok">
但我認爲你也可以使用ant-contrib的if statement執行以下操作:
<if>
<equals arg1="${directory.found.yes}" arg2="true" />
<then>
<antcall target="update.back" />
</then>
</if>
相反的<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
實體if
或unless
參數屬性是否被選中的任何相關。這允許目標在嘗試執行之前調用一個測試。
這不僅僅是一個副作用,而是內置於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屬性只啓用或禁用目標他們所附的。它們不控制目標是否依賴於條件目標執行。事實上,他們甚至在目標即將被執行之前都不會被評估,並且其所有前任都已經運行。
+1 antcall應該不惜一切代價避免 - 打開一個新的項目範圍,打破流程(取決於被調用目標的對象也會被調用..),屬性不會被傳遞迴調用目標。這是邪惡的根源,維護這樣的腳本是PITA。最後antcall不再需要ant> = 1.6 =>使用macrodef來代替。 – Rebse 2013-04-08 21:29:21
你可以擴大一點嗎?它可以完成,但是你的問題並不清楚 - 你在問題中提到'backup.yes',但不在示例代碼中。 – 2013-04-08 11:29:09