我已經計算出創建包含在目錄中我們可重複使用的構建腳本一個jar文件的解決方案,比如COM /例子/ ANT/sharedbuild,它可以在1.8螞蟻進口:
<project>
<import>
<javaresource name="com/example/ant/sharedbuild/java.xml">
<classpath location="../../../../target/ant-shared-build.jar" />
</javaresource>
</import>
</project>
在我的情況下,它定義了項目的所有「公共」目標,以執行基於Java的構建。
語法有點冗長,特別是當我添加了越來越多的包含文件(比如添加創建OSGi jar的能力)。通過將一個包含macrodef和scriptdef組合的antlib.xml添加到jar文件(與共享構建腳本位於同一目錄中),構建文件現在可以如下所示(現在也可以創建OSGi jar包):
<project xmlns:build="antlib:com.example.ant.sharedbuild">
<taskdef uri="antlib:com.example.ant.sharedbuild"
classpath="../../../../target/ant-shared-build.jar" />
<build:build using="java, jar, bundle" />
</project>
不幸的是,我不能共享代碼的macrodef或scriptdef,但實際上它並不難:一些JavaScript解析使用屬性和循環每個,從中獲取文件名,並導入。
我在硬盤上的固定位置(相對於我的項目)引用jar文件。我認爲我們可以做得更好。理想情況下,我想從中央位置獲取(版本化!)jar文件。既然我們已經使用艾維(與HTTP資料庫),我們可以發佈的jar文件有(再次,一個版本),並且直接從那裏取,
<project xmlns:build="antlib:com.example.ant.sharedbuild">
<property name="ant.shared.build.jar.file"
location="${user.home}/ant/ant-shared-build-1.5.3.jar" />
<get src="http://repo.example.com/.../ant-shared-build-1.5.3.jar"
dest="${ant.shared.build.jar.file}"
skipexisting="true" />
<taskdef uri="antlib:com.example.ant.sharedbuild"
classpath="${ant.shared.build.jar.file}" />
<build:build using="java, jar, bundle" />
</project>
有一些問題是:
- 它再次變得冗長。
- 每個build.xml都會重複詳細程度。
- 有很多重複的樣板,特別是版本號。
爲了緩解這些問題,在每個包含build.xml的目錄中,我還有一個bootstrap.xml(名稱並不重要)。每個版本。XML然後包括本文件:
<project xmlns:build="antlib:com.example.ant.sharedbuild">
<include file="bootstrap.xml" />
<build:build using="java, jar, bundle" />
</project>
每個bootstrap.xml,在最低限度,包括它的父的bootstrap.xml:
<project>
<include file="../bootstrap.xml" />
</project>
頂層bootstrap.xml(根),然後不獲得jar文件並創建自定義任務,如上面的工作:
<project>
<property name="ant.shared.build.version"
value="1.5.3" />
<property name="ant.shared.build.jar.filename"
value="ant-shared-build-${ant.shared.build.version}.jar" />
<property name="ant.shared.build.jar.file"
location="${user.home}/ant/${ant.shared.build.jar.filename}" />
<get src="http://repo.example.com/.../${ant.shared.build.jar.filename}"
dest="${ant.shared.build.jar.file}"
skipexisting="true" />
<taskdef uri="antlib:com.example.ant.sharedbuild"
classpath="${ant.shared.build.jar.file}" />
</project>
雖然沒有直接關係的問題,實際上我再處理macrodef和scriptdef成定製Ant任務,因爲我希望能夠支持語法看起來像這樣:
<project xmlns:build="antlib:com.example.ant.sharedbuild">
<include file="bootstrap.xml" />
<build:build>
<using>
<java />
<bundle>
<manifest>
Import-Package: *,org.joda.time;version="[1.6.0,1.6.0]"
Bundle-Activator: com.example.time.impl.Activator
</manifest>
</bundle>
</using>
</build:build>
</project>
我應該指出,僅僅建立一個可再發行組件構建並不意味着它將會是有用的。您仍然需要投入時間和精力來創建符合類似特徵設計的凝聚力,模塊化,一致的實施方案。這是更重要的,因爲您需要跨項目,跨團隊,跨組織邊界等共享腳本。
總之,通過創建一個jar文件,其版本號可獨立於特定文件位置或SCM工具,我們可以獲得真正的共享但可重複的構建。
非常感謝!我正在尋找錯誤的任務。難怪我找不到它。一些例子的鏈接也會有很大的幫助:如果你有一些好的,你可以隨意使用。 – nrobey 2011-02-26 17:30:56
如果您想要可重複構建,這是一個糟糕的主意。 – 2011-02-27 18:29:09
@Dominic Mitchell - 好點。如果common_directive.xml不是靜態的,最好是更好地管理該依賴關係。 – 2011-02-27 22:13:47