Ant的if / unless条件属性有哪些使用限制?

时间:2016-03-28 21:02:02

标签: ant

所以我们使用基本的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始终设置为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手册中找不到任何此类限制,但该手册使用不同的描述在至少两个不同的地方描述了if / unless语法。 (由于手册使用了HTML框架,我不确定它们在哪里;每个网址都显示为index.html。无论何时我参考手册,感觉就像我在1999年一样浏览,宝贝! * MC Hammer是否会滑出房间*

1 个答案:

答案 0 :(得分:1)

自Ant 1.4以来,嵌套在<include>元素下的<exclude><patternset>元素已支持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>

在上面的示例中,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文件。

坚持ifelse元素的简单<include><exclude>属性,事情应该有效。