所以我们使用基本的Ant 1.9.4,稍微使用1.9.1的新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
始终设置为true
或false
,永远不会设置,并且永远不会设置为任何其他值(在之前读取的属性文件中分配,如果这很重要),它的工作非常精彩,完全符合我们所需要的行为。快乐!
最近,我们试图让一些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:true
或if:set
属性。有些地方很完美。有些地方我得到了一些奇怪的无意义错误,显然解析器在它离开轨道时打印的那种东西。每次将if:set="$(foo}"
重新导入if="foo"
和if:true="${foo}"
重新导入if="${foo}"
都会回到所需的if-then行为。所以这不是阻塞问题,但如果可能,我们宁愿自我记录:condition
。
我在Ant手册中找不到任何此类限制,但该手册使用不同的描述在至少两个不同的地方描述了if / unless语法。 (由于手册使用了HTML框架,我不确定它们在哪里;每个网址都显示为index.html
。无论何时我参考手册,感觉就像我在1999年一样浏览,宝贝! * MC Hammer是否会滑出房间* )
答案 0 :(得分:1)
自Ant 1.4以来,嵌套在<include>
元素下的<exclude>
和<patternset>
元素已支持if
and else
attributes。每个<fileset>
都嵌套了隐式<patternset>
,因此可以使用if
和else
属性...
<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>
在上面的示例中,if
中的<include>
是&#34;默认&#34;中的普通Ant属性。 Ant XML命名空间。另一方面,if:true
位于ant:if
XML命名空间中。
命名空间if:true
与<include>
元素不兼容。如果提供给if:true
的值未评估为true
,则Ant的行为就好像整个<include>
元素从未存在过一样。这很糟糕,因为Ant采用空模式集来表示&#34;匹配每个文件&#34;。这可能就是为什么你收到&#34;一个zip文件不能包含自己&#34;错误; <fileset>
可能包含目标JAR文件。
坚持if
和else
元素的简单<include>
和<exclude>
属性,事情应该有效。