Ant(1.6.5) - 如何在一个< condition>中设置两个属性或者< if>
-
06-07-2019 - |
题
我试图将两个不同的字符串分配给两个不同的变量,这些变量依赖于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>
但是我得到包含&quot; &lt; if&gt;
&quot;的行的空指针异常。我可以使用&lt; condition property = ...&gt;
标记来使用它,但一次只能设置一个属性。我尝试使用&lt; propertyset&gt;
,但也不允许这样做。
我是蚂蚁的新手,你可能已经猜到了。)。
GAV株系
解决方案
有几种方法可以做到这一点。最简单的是只使用两个 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>
我们再次利用财产不变性。如果您不想这样做,可以使用除非
属性,以及额外的间接级别:
<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
和除非
属性只检查属性是否设置,而不是属性。 target
的
其他提示
您可以使用 Ant-Contrib 库来访问一个整洁的&lt; if&gt;&lt; then&gt;&lt; else&gt;
语法,但它需要一些下载/安装步骤。
请参阅其他问题: ant-contrib - if / then / else task
不隶属于 StackOverflow