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

¿Fue útil?

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top