Ant (1.6.5): cómo establecer dos propiedades en una < condición > o < if >
-
06-07-2019 - |
Pregunta
Estoy intentando asignar dos cadenas diferentes a dos variables diferentes que dependen de dos booleanos en Ant.
Pseudocódigo (ish):
if(condition)
if(property1 == null)
property2 = string1;
property3 = string2;
else
property2 = string2;
property3 = string1;
Lo que he intentado es;
<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>
Pero obtengo una excepción de puntero nulo para la línea que contiene " < if >
" ;. Puedo hacer que funcione con las etiquetas < condition property = ... >
pero solo puedo establecer una propiedad a la vez. Intenté usar < propertyset >
pero eso tampoco estaba permitido.
Soy nuevo en hormigas como probablemente habrás adivinado :).
Gav
Solución
Hay varias maneras de hacer esto. Lo más sencillo es usar solo dos declaraciones de condición
y aprovechar la inmutabilidad de la propiedad:
<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"/>
Esto es un poco engorroso y no se escala bien, pero para solo dos propiedades probablemente usaría este enfoque.
Una forma algo mejor es usar un objetivo condicional:
<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>
Nuevamente estamos aprovechando la inmutabilidad de la propiedad aquí. Si no desea hacerlo, puede usar el atributo a menos que
, y un nivel adicional de direccionamiento indirecto:
<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>
Es importante tener en cuenta que los atributos if
y a menos que
de target
solo verifican si la propiedad está establecida, no el valor del propiedad.
Otros consejos
Puede usar la biblioteca Ant-Contrib para tener acceso a una sintaxis de < if > < then > < else >
, sin embargo, requerirá unos pocos pasos de descarga / instalación.
Vea esta otra pregunta SO: ant-contrib - if / then / else task