2009-10-24 5 views
13

Estoy tratando de asignar dos cadenas diferentes a dos variables diferentes dependientes de dos booleanos en Ant.Ant (1.6.5) - Cómo establecer dos propiedades en una <condition> o <if>

Pseudocódigo (más o menos):

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 me da una excepción de puntero nulo para la línea que contiene "<if>". Puedo hacer que funcione usando las etiquetas <condition property=...>, pero solo puedo establecer una propiedad a la vez. Intenté usar <propertyset>, pero eso tampoco estaba permitido.

Soy nuevo en hormiga, ya que probablemente habrá adivinado :).

Gav

Respuesta

34

Existen varias formas de hacerlo. La más sencilla es utilizar sólo dos condition declaraciones, y tomar ventaja de la inmutabilidad de 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 adapta bien, pero por sólo dos propiedades que probablemente utilizar este enfoque.

Un poco mejor manera 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> 

Estamos tomando de nuevo las ventajas de la inmutabilidad propiedad aquí. Si no quieres hacer eso, puede utilizar el atributo unless y un nivel adicional de indirección:

<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 señalar que los if y unless atributos de target sólo verifican si la propiedad es establecer, no el valor de la propiedad.

+2

Gracias, respuesta completa. – gav

+0

Justo lo que necesitaba. Gracias por tener su Brain on Ant, en el '09. –

1

Puede usar la biblioteca Ant-Contrib para tener acceso a una sintaxis clara de <if><then><else>, sin embargo, requerirá algunos pasos de descarga/instalación.

Ver este otro ASUNTO pregunta: ant-contrib - if/then/else task

Cuestiones relacionadas