2016-03-28 59 views
1

所以我們使用的是基本的Ant 1.9.4,稍微使用了1.9.1的新的if/unless屬性。例如,對Ant的if/unless條件屬性有什麼用法限制?

<project xmlns:if="ant:if" xmlns:unless="ant:unless"> 
.... miles and miles of XML .... 

<jar ....> 
    <service ....> 
    <provider classname="a.b.c.X" if:true="${some.flag}"/> 
    <provider ..../> 
    </service> 
    <fileset> 
    ....the stuff in here will matter shortly.... 
    </fileset> 
</jar> 

some.flag總是被設置爲truefalse,從來沒有離開過未設置,並且永遠不會設置爲任何其他值(在先前看過的屬性文件中指定,如果該事項),以及它奇妙的作品,給我們完全我們需要的行爲。喜悅!

最近,我們試圖做出一些jar任務的fileset條目聰明一點的,如

<fileset dir="somedir"> 
    <include name="optional_file" if:true="${some.flag}"/> <!-- same property name as before --> 
</fileset> 

有了這個語法,我們得到一個錯誤「的zip文件不能包括自身」,有行號指向jar任務的開始。這顯然是虛假的語法。 然而,改變這個第二if:true簡單if出於絕望 - 並且不對其他變化 - 避免錯誤,給了我們正確的基於旗可選包行爲。

這是怎麼回事嗎?新的語法在<fileset>和/或fileset的嵌套<include>塊中簡單不可用?

作爲一個實驗,我嘗試在其他一些有用的地方適當使用if:trueif:set屬性。有些地方完美運作。有些地方我得到了一些奇怪的無意義錯誤,顯然這是解析器在離開軌道時打印的東西。每一次,再加工成if:set="$(foo}"if="foo"if:true="${foo}"if="${foo}"回所需的if-then行爲。所以這不是一個阻塞問題,但如果可以的話,我們寧願自己記錄:condition

我找不到在Ant手冊這種限制的提及,但本手冊介紹了,如果/除非使用不同的描述至少兩個不同位置的語法。 (我不確定它們是由於手冊使用HTML框架而引起的;每個URL顯示爲index.html。隨時我參考手冊,感覺就像我正在瀏覽1999年一樣,寶貝!* MC Hammer slide出了房間*

回答

1

由於下<patternset>元件嵌套螞蟻1.4,<include><exclude>元件都支持if and else attributes。每個<fileset>下設嵌套的隱式<patternset>,所以ifelse屬性可用於它...

<condition property="some.flag.istrue"> 
    <istrue value="${some.flag}"/> 
</condition> 
<fileset dir="somedir"> 
    <!-- The "if" below is different than "if:true". --> 
    <include name="optional_file" if="some.flag.istrue"/> 
</fileset> 

在上述例子中,在<include>if處於「默認」螞蟻普通螞蟻屬性XML名稱空間。另一方面,if:true位於ant:if XML名稱空間中。

的命名空間if:true<include>元素很好地工作。如果提供給if:true值不計算爲true,然後螞蟻的行爲就好像整個<include>元素根本不存在。這很糟糕,因爲Ant將空模式集表示爲「匹配每個文件」。這可能就是您收到「一個zip文件不能包含它自己」錯誤的原因; <fileset>可能包含目標JAR文件。

堅持用簡單的ifelse屬性爲<include><exclude>元素和事情應該工作。

+0

啊哈!很好的解釋,謝謝你的時間! –