Ant(1.6.5) - 如何在一个<condition>或<if> </if> </condition>中设置两个属性

时间:2009-10-24 16:49:08

标签: ant properties conditional-statements if-statement

我试图将两个不同的字符串分配给两个不同的变量,这些变量依赖于Ant中的两个布尔值。

伪代码(ish):

if(condition)
   if(property1 == null)
      property2 = string1;
      property3 = string2;
   else
      property2 = string2;
      property3 = string1;

我尝试过的是什么;

<if>
  <and>
    <not><isset property="property1"/></not>
    <istrue value="${condition}" />
  </and>
  <then>
    <property name="property2" value="string1" />
    <property name="property3" value="string2" />
  </then>
  <else>
    <property name="property2" value="string2" />
    <property name="property3" value="string1" />
  </else>
</if>

但是我得到包含“<if>”的行的空指针异常。我可以使用<condition property=...>标记使其工作,但一次只能设置一个属性。我尝试使用<propertyset>,但也不允许这样做。

我是蚂蚁的新手,你可能已经猜到了。)。

GAV株系

2 个答案:

答案 0 :(得分:34)

有几种方法可以做到这一点。最直接的方法是使用两个condition语句,并利用属性不变性:

<condition property="property2" value="string1">
    <isset property="property1"/>
</condition>
<condition property="property3" value="string2">
    <isset property="property1"/>
</condition>

<!-- Properties in ant are immutable, so the following assignments will only
     take place if property1 is *not* set. -->
<property name="property2" value="string2"/>
<property name="property3" value="string1"/>

这有点麻烦并且不能很好地扩展,但对于两个属性我可能会使用这种方法。

更好的方法是使用条件目标:

<target name="setProps" if="property1">
    <property name="property2" value="string1"/>
    <property name="property3" value="string2"/>
</target>

<target name="init" depends="setProps">
    <!-- Properties in ant are immutable, so the following assignments will only
         take place if property1 is *not* set. -->
    <property name="property2" value="string2"/>
    <property name="property3" value="string1"/>

    <!-- Other init code -->
</target>

我们再次利用财产不变性。如果您不想这样做,可以使用unless属性和额外的间接级别:

<target name="-set-props-if-set" if="property1">
    <property name="property2" value="string1"/>
    <property name="property3" value="string2"/>
</target>

<target name="-set-props-if-not-set" unless="property1">
    <property name="property2" value="string2"/>
    <property name="property3" value="string1"/>
</target>

<target name="setProps" depends="-set-props-if-set, -set-props-if-not-set"/>

<target name="init" depends="setProps">
    <!-- Other init code -->
</target>

请务必注意if的{​​{1}}和unless属性仅检查属性是否已设置,而不是属性的值。

答案 1 :(得分:1)

您可以使用Ant-Contrib库来访问整齐的<if><then><else>语法,但这需要一些下载/安装步骤。

请参阅此其他问题:ant-contrib - if/then/else task