2011-05-09 34 views
45

定義順序構建步驟時,我使用target元素的depends屬性。我最近看到一個ant文件,其中構建序列由目標內部的antcall元素定義。 爲了說明:ant depends與antcall

<target name="a" depends="b"> 
...</target> 

VS

<target name="a"> 
<antcall target="b"/> 
...</target> 

有兩種方法之間真正的區別嗎?他們中的一個更可取?

+0

唯一需要** antcall **的是當你從螞蟻移動到gradle,並從gradle調用螞蟻目標時。在這種情況下,你的ant buildfile可能不會執行** depends **目標,在這種情況下,你將需要使用'antcall'。 – 2016-08-03 13:36:48

回答

52

這兩種方法之間的主要區別在於,在depends目標是執行總是,而在antcall目標只有當含有靶是被執行。

澄清的實例:

<target name="a" depends="b" if="some.flag"> 

</target> 

這裏,b將總是被執行,而如果some.flag定義a將只執行。

<target name="a" if="some.flag"> 
    <antcall target="b" /> 
</target> 

在這裏,如果ba,即如果some.flag定義將僅被執行。

+2

爲了補充說明,可以用''多次調用目標,而如果所有對它們的引用都是通過依賴關係完成的,則目標可能最多隻能執行一次。 – 2014-07-08 20:11:51

+0

'depends'不是**總是**執行。一個例子是從gradle導入ant腳本,並從gradle調用主目標。在那種情況下,主要目標的「depends」不會被執行。 – 2016-08-03 13:40:35

14

Antcall相對很少使用,這是因爲:

被叫目標(S)的一個新的 項目運行;請注意,這意味着 屬性,引用等由 設置的目標將不會持續返回到調用項目的 。

換句話說,antcall是全新的孤立的Ant進程運行。

+0

這是否也意味着antcall'ed任務並行運行? – kostja 2011-05-09 12:46:15

+2

不,antcall是同步的,就像任何其他任務一樣。 Ant中有一個任務用於併發執行。 – 2011-05-09 15:08:24

+0

當我看到文檔時,我看到這樣的引用:「默認情況下,當前項目的所有屬性將在新項目中可用。或者,您可以將inheritAll屬性設置爲false,並且只設置」user「屬性(即,通過命令行傳遞的)將被傳遞給新項目。「 https://ant.apache.org/manual/Tasks/antcall.html。這與你所說的不同。 – Kamil 2016-07-26 12:04:12

0
<target name="a" depends="b"> ...</target> 

這意味着beforeing執行任何陳述或目標上的任何標記,ANT使得確保目標b的成功執行

,並且可以使用antcall一些陳述或標籤被從執行後,調用任何目標呼叫目標。

78

最大的區別是Ant將確保通過depends聲明的依賴關係最多稱爲一次。例如:

<target name="a" /> 

<target name="b" depends="a" /> 

<target name="c" depends="a" /> 

<target name="d" depends="b, c" /> 

如果我把目標dbc被調用。但是,a僅被調用一次(即使bc都依賴於它)。

現在假設我們決定使用antcall,而不是依賴於目標d

<target name="d"> 
    <antcall target="b" /> 
    <antcall target="c" /> 
</target> 

調用目標d現在將調用目標bc;然而,目標a將被叫兩次,一次爲b,然後再次爲c

換句話說,antcall迴避了作爲Ant基石的正常依賴關係規則。

我不認爲antcall應該用來替代正常的類Ant依賴;這就是depends的用途。那麼你什麼時候使用它? antcall任務允許您控制定義了哪些屬性和引用(這就是爲什麼創建新的Ant環境 - 爲什麼它很慢),因此它可以用來創建同一事物的變體;例如可能有兩個罐子,一個罐子和一個沒有調試符號。

過度使用antcall會造成緩慢,易碎和難以維護的構建腳本。把它想象成螞蟻的goto--它是邪惡的。除非在不常見的情況下,大多數寫得很好的構建腳本根本就不需要它。

+2

「一次又一次」的好處! Upvoted,當然。 – 2011-05-10 04:15:10

+0

謝謝你,一個高度相關的細節 – kostja 2011-05-10 06:35:55

+5

我曾經使用antcall爲了設置「參數化」的目標,我可以重複使用,但是1.6版本中添加的macrodef很早以前就爲這種重用。 – Scott 2011-12-22 17:49:46

7

antcall是螞蟻的GOTO。這很糟糕。這是一個很好的方式來製作一個不可維護的老鼠巢巢。在ant-contrib旁邊,這是嗅覺過度複雜難以維護的ant文件的最佳方式。 (即使一個好的antfile很粗糙)

如果你的依賴設置正確,你應該能夠成功運行任何目標,不像antcall模式。

沒有人觸及過的另一個原因是vizant,如果它是一個複雜的構建,生成目標依賴關係圖的能力非常好。如果你使用antcall,你會被擰緊。

我希望@Vladimir Dyuzhev是正確的,antcall很少使用 - 我去過很多商店,這是常態。

+1

vizant非常酷,不知道該工具,謝謝 – kostja 2012-02-10 14:06:42

+1

Antcall是一種非常方便的方法,可以將重複步驟提取到單獨的任務中,並用不同的參數調用它。如果vizant不支持antcall,這是一個問題,唉。 – 2012-12-27 03:07:48

+2

沒有。絕對沒有。 ant中的程序流是用depends完成的,antcall調用到同一個build.xml中是一種令人反感的行爲。如果你需要多次使用不同的輸入來做類似的事情,你最好使用螞蟻宏。 – thekbb 2012-12-27 20:54:43