2008-10-22 34 views
29

我有一個螞蟻build.xml,它使用<copy>任務來複制各種xml文件。它使用過濾來合併來自build.properties文件的屬性。每個環境(dev,stage,prod)都有不同的build.properties,用於存儲該環境的配置。螞蟻過濾 - 如果屬性沒有設置失敗

有時我們會向Spring XML或其他需要更新build.properties文件的配置文件添加新屬性。

我想螞蟻快速失敗,如果有從build.properties缺少屬性。也就是說,如果有任何原始@[email protected]令牌將其生成到生成的文件中,我希望構建死掉,以便用戶知道他們需要向其本地build.properties添加一個或多個屬性。

這是可能與內置任務?我無法在文檔中找到任何內容。我即將寫一個自定義的螞蟻任務,但也許我可以放下自己的努力。

感謝

回答

19

你可以做到這一點的螞蟻1.7,使用的組合LoadFile任務和match條件。

<loadfile property="all-build-properties" srcFile="build.properties"/> 
<condition property="missing-properties"> 
    <matches pattern="@[^@]*@" string="${all-build-properties}"/> 
</condition> 
<fail message="Some properties not set!" if="missing-properties"/> 
+0

不錯。我實際上想做相反的事情(確保某些關鍵文件中包含@,有時候會有人不小心檢查沒有替代標記的版本),並且能夠使用這種方法。 – 2009-06-22 16:37:27

+0

非常好。對不起,我以前沒有接受過。看起來像我以後的樣子。 – 2011-01-15 00:05:50

4

我會建議你嘗試使用<property file="${filter.file}" prefix="filter">的屬性,以實際加載到螞蟻,然後fail如果其中任何一個都沒有設置,但我覺得我解釋你的問題錯了(即如果未在屬性文件中設置指定的屬性,則您想失敗)。

我認爲你最好的選擇可能是使用<exec>(取決於你的開發平臺)對「@」字符執行grep,然後將屬性設置爲找到的發生次數。不知道確切的語法,但...

<exec command="grep \"@\" ${build.dir} | wc -l" outputproperty="token.count"/> 
<condition property="token.found"> 
    <not> 
     <equals arg1="${token.count}" arg2="0"/> 
    </not> 
</condition> 
<fail if="token.found" message="Found token @ in files"/> 
0

如果exec命令在螞蟻的版本已經過時,你可以使用重定向器,這樣的:

<exec executable="grep"> 
    <arg line="@ ${build.dir}"/> 
    <redirector outputproperty="grep.out"/> 
</exec> 
<exec executable="wc" inputstring="${grep.out}"> 
    <arg line="-l"/> 
    <redirector outputproperty="token.found"/> 
</exec> 

創建token.found財產

爲conditonal

93

如果你正在尋找一個特定的屬性,你可以使用帶有除非屬性的失敗任務,例如:

<fail unless="my.property">Computer says no. You forgot to set 'my.property'!</fail>

0

由於螞蟻1.6.2 condition也可以嵌套在裏面fail

以下宏可以很容易地有條件地檢查多個屬性。

<macrodef name="required-property"> 
    <attribute name="name"/> 
    <attribute name="prop" default="@{name}"/> 
    <attribute name="if" default="___"/> 
    <attribute name="unless" default="___"/> 
    <sequential> 
     <fail message="You must set property '@{name}'"> 
      <condition> 
       <and> 
        <not><isset property="@{prop}"/></not> 
        <or> 
         <equals arg1="@{if}" arg2="___"/> 
         <isset property="@{if}"/> 
        </or> 
        <or> 
         <equals arg1="@{unless}" arg2="___"/> 
         <not><isset property="@{unless}"/></not> 
        </or> 
       </and> 
      </condition> 
     </fail> 
    </sequential> 
</macrodef> 

<target name="required-property.test"> 
    <property name="prop" value=""/> 
    <property name="cond" value="set"/> 
    <required-property name="prop"/> 
    <required-property name="prop" if="cond"/> 
    <required-property name="prop" unless="cond"/> 
    <required-property name="prop" if="cond2"/> 
    <required-property name="prop" unless="cond2"/> 
    <required-property name="prop" if="cond" unless="cond"/> 
    <required-property name="prop" if="cond" unless="cond2"/> 
    <required-property name="prop" if="cond2" unless="cond"/> 
    <required-property name="prop" if="cond2" unless="cond2"/> 
    <required-property name="prop2" unless="cond"/> 
    <required-property name="prop2" if="cond2"/> 
    <required-property name="prop2" if="cond2" unless="cond"/> 
    <required-property name="prop2" if="cond" unless="cond"/> 
    <required-property name="prop2" if="cond2" unless="cond2"/> 
    <required-property name="success"/> 
</target>