2011-02-07 53 views
2

我有一個構建系統,其中許多組件完全相同,所以我一直在更改它以在大多數構建任務的常用文件上使用「導入」。然後,構建系統還需要構建它所依賴的任何模塊。所以我粗略地...在Ant中嵌套導入

common.xml 
project1.xml 
    - import common.xml 
project2.xml 
    - include project1.xml 
    - import common.xml 

在common.xml中有一個名爲'build'的目標。我希望project2能夠包含project1並使用擴展點來放置對構建目標的依賴。但由於某種原因,它不承認project1有構建目標。如果我將其更改爲依賴於project1.xml中定義的目標,那就沒問題。但我需要能夠指定common.xml中的目標。

有沒有辦法做到這一點?

沒有ant-contrib。該項目曾經使用過,但我試圖擺脫它,所以我們沒有可怕的程序構建系統代碼。該項目有許多依賴關係的情況,看起來像鑽石和適當的依賴關係圖(螞蟻自動生成的依賴關係圖)將大有幫助。

因此,我創建一些簡單的文件來說明我的問題。

<project name="top" default="build"> 
    <include file="mid.xml" as="mid" /> 
    <target name="build"> 
    <antcall target="mid.build" /> 
    </target> 
</project> 

<project name="mid" default="build"> 
    <!-- <target name="build"> --> 
    <!-- <echo message="build mid" /> --> 
    <!-- </target> --> 
    <import file="common.xml" /> 
</project> 

<project name="common"> 
    <target name="build"> 
    <echo message="build common" /> 
    </target> 
</project> 

失敗。 top.xml找不到mid.build。當我運行ant -p列出目標時,它顯示build和common.build。所以我嘗試添加到mid.xml構建文件中,並且正確地構建它。現在唯一的問題是,如果我取消上面的mid註釋來定義自己的構建步驟,它會被導入覆蓋並被忽略。所以它最終變成[build,common.build]而不是[build,mid.build]。

回答

2

嘗試使用include task代替,特別是在mid.xml水平:

<project name="mid" default="build"> 
    <include file="common.xml" /> 
</project> 

的「包括」和「進口」的任務有其他方法來壓倒一切的任務。請參閱'<如何導入>不同於<包括>?'include task docs

短的版本:採用進口,如果你 打算覆蓋的目標,否則 使用包括

這聽起來像你想被挑共同「打造」的目標除非在中期定義。問題在於,使用'import'任務時,讀入(即common.xml)版本將覆蓋mid.xml中的版本。因爲「包括」不容許超馳,當讀common.xml在呼叫方(mid.xml)中定義的一個並不覆蓋。

示例:對於上述mid.xml,ant -f top.xml報告:

build: 

mid.build: 
    [echo] build common 

隨着build目標覆蓋在mid.xml:

<project default="build" name="mid"> 
    <target name="build"> 
    <echo message="build mid" /> 
    </target> 
    <include file="common.xml" /> 
</project> 

結果變爲:

build: 

mid.build: 
    [echo] build mid