2009-12-07 40 views
4

我有一個現有的Ant項目,並希望通過避免重新構建已更新的組件來加快構建過程 。避免在Ant中重新構建必備組件

Ant允許您指定一個目標依賴於另一個目標,但是通過 默認情況下,每個先決條件始終都會重建,即使它已經達到 的日期。 (這是螞蟻和之間做出一個關鍵的區別在默認情況下,使 只能重新建立需要的時候目標 - 。也就是說,如果一些前提條件是 更新)

<uptodate property="mytarget.uptodate"> // in set.mytarget.uptodate task 
    ... 
</uptodate> 
<!-- The prerequisites are executed before the "unless" is checked. --> 
<target name="mytarget" depends="set.mytarget.uptodate" unless="mytarget.uptodate"> 
    ... 
</target> 

爲了讓螞蟻重新構建只有在必要時才需要先決條件,似乎在Ant中有兩個通用方法 。

第一種方法是使用uptodate任務設置屬性。然後, 您的任務可以測試屬性,並只有在屬性設置爲(非) 時才構建。

<uptodate property="mytarget.uptodate"> // in set.mytarget.uptodate task 
    ... 
</uptodate> 
<!-- The prerequisites are executed before the "unless" is checked. --> 
<target name="mytarget" depends="set.mytarget.uptodate" unless="mytarget.uptodate"> 
    ... 
</target> 

一種替代第一種方法是使用outofdate任務從螞蟻的contrib。 它更好,它只是一個目標,沒有單獨的屬性被定義爲 ;相比之下,過期需要單獨的目標來設置和 測試屬性。

第二種方法是使用<modified> 選擇器創建<fileset>。它計算文件的MD5哈希值並選擇其MD5 與先前存儲值不同的文件。它是可選的設置

<param name="cache.cachefile"  value="cache.properties"/> 

選擇內;它默認爲「cache.properties」。下面是 一個例子複製src到DEST其內容的文件已經 改變:

<copy todir="dest"> 
     <fileset dir="src"> 
      <modified/> 
     </fileset> 
    </copy> 

這些都不是很滿意,因爲它要求我寫一個過程螞蟻 代碼(避免重複建設)應該是自動的。

還有常春藤,但我不能從它的文檔中知道它是否提供 提供此功能。 Ivy文檔中的關鍵用例似乎是 從互聯網上下載子項目,而不是避免浪費 通過暫存單個項目的部分工作。 Maven提供類似的 功能,其文檔中突出顯示了相同的用例。 (將一個現有的非trivila項目移動到Maven據說是一場噩夢;相比之下,使用Maven開始greenfield開發更可口。)

有沒有更好的方法?

回答

1

這種有條件的大量積累的編制是功能使我initally錯過ANT。我建議不要使用目標依賴關係,而是建議將大型項目分成更小的模塊,每個模塊都發布到公共共享存儲庫。

Ivy可以用來控制項目主模塊使用的組件版本。

<ivy-module version="2.0"> 
    <info organisation="com.myspotontheweb" module="multi_module_project"/> 
    <publications> 
     <artifact name="main" type="jar"/> 
    </publications> 
    <dependencies> 
     <dependency org="com.myspotontheweb" name="component1" rev="latest.integration"/> 
     <dependency org="com.myspotontheweb" name="component2" rev="latest.integration"/> 
     <dependency org="com.myspotontheweb" name="component3" rev="latest.integration"/> 
     <dependency org="com.myspotontheweb" name="component4" rev="latest.integration"/> 
    </dependencies> 
</ivy-module> 

常春藤:如果他們已經改變檢索任務將只下載/複製的子模塊之一(從構建文件出版)

這一切聽起來複雜,但也許你已經在您的構建文件中對項目進行了細分....例如,如果您的ANT uptodate任務正在依賴一個構建文物。

+0

這將工作。它確實需要將我繼承的項目以精細的粒度完全重新設計,並在某些情況下重新構建爲非獨立實體的子項目。這是我所害怕的。 – mernst 2010-02-15 03:15:43

+0

查看buildlist IVY任務。這可以根據各個項目組件的聲明依賴關係來控制整個項目的構建。 是的,您的項目需要重組,但是您可能會發現它會模擬構建過程並提高整體架構的可視性。這是一個個案調用 – 2010-02-17 10:00:25

相關問題