2010-08-26 78 views
2

我有一套嵌套的Ant構建文件,我需要控制哪些屬性由每個「子」任務繼承。我試圖將這些定義爲propertysets(以使代碼易於管理),但這些不是由子任務繼承的,與屬性不同。嵌套任務的Ant屬性集繼承

下面的例子演示了問題,foo.*被複制到中間的項目,但不是底部項目。如果我將每個屬性定義爲明確繼承,如bar.*,則它們也會由底部項目繼承。

有沒有什麼辦法讓一組屬性的繼承一路下滑,以同樣的方式獨立屬性呢?在不重寫子流程的情況下,還有什麼我可以嘗試的?

[top.xml]

<?xml version="1.0"?> 
<project name="test-top"> 
    <property name="foo.1" value="1"/> 
    <property name="foo.2" value="2"/> 
    <property name="bar.1" value="1"/> 
    <property name="bar.2" value="2"/> 

    <ant antfile="middle.xml" inheritall="false"> 
     <propertyset> 
      <propertyref prefix="foo."/> 
     </propertyset> 
     <property name="bar.1" value="${bar.1}"/> 
     <property name="bar.2" value="${bar.2}"/> 
    </ant> 
</project> 

[middle.xml]

<?xml version="1.0"?> 
<project name="test-middle"> 

    <echo>foo ${foo.1} ${foo.2}</echo> 
    <echo>bar ${bar.1} ${bar.2}</echo> 

    <ant antfile="bottom.xml" inheritall="false"/> 
</project> 

[bottom.xml]

<?xml version="1.0"?> 
<project name="test-bottom"> 

    <echo>foo ${foo.1} ${foo.2}</echo> 
    <echo>bar ${bar.1} ${bar.2}</echo> 

</project> 

[螞蟻-f top.xml輸出]

[echo] foo 1 2 
[echo] bar 1 2 
[echo] foo ${foo.1} ${foo.2} 
[echo] bar 1 2 

回答

2

我認爲亞歷山大的解決方案非常接近。但是,如何呢,在middle.xml或bottom.xml中不需要做任何改變。

想法是使用echoproperties任務將屬性集「展開」爲單個屬性,然後在ant任務調用中使用該屬性。

在致電middle.xml,寫入該屬性設置了使用這樣的事情:

<echoproperties destfile="myproperties.txt"> 
    <propertyset> 
     <propertyref prefix="foo."/> 
     <propertyref prefix="bar."/> 
    </propertyset> 
</echoproperties> 

然後撥打電話到middle.xml:提供給螞蟻任務inherit all the way down

<ant antfile="middle.xml" inheritall="false"> 
    <property file="myproperties.txt" /> 
</ant> 

屬性正如你所說,所以你只需要改變top.xml:

這些屬性相當於 您在命令 行上定義的屬性。這些都是特殊屬性,並且 它們總是會被傳遞下來,甚至可以通過 通過額外的< 螞蟻> 繼承設置爲false(見上文)。

+0

感謝馬丁和亞歷山大。 我已經不知道如何編寫屬性的文件,但還沒有看到任何方式做到這一點不明確重新上市,我想傳下去(的所有屬性,即,沒有比'欄更好的解決方案。*上面的' )。我錯過了「echoproperties」任務,因爲它在Ant文檔中被列爲「可選任務」而不是「核心任務」...現在我知道了! – 2010-08-27 10:28:58

1

在top.xml中,您可以使用<propertyfile>任務創建具有可繼承屬性的文件。

然後你就可以在每個子模塊的<property file="..."/>加載此文件。