Question

J'essaie d'assigner deux chaînes différentes à deux variables différentes dépendant de deux booléens dans Ant.

Pseudocode (ish):

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

Ce que j'ai essayé, c'est;

<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>

Mais j'obtiens une exception de pointeur NULL pour la ligne contenant "" si "> ". Je peux le faire fonctionner avec les balises < condition property = ... > mais je ne peux définir qu'une propriété à la fois. J'ai essayé d'utiliser < propertyset > mais cela n'était pas autorisé non plus.

Je suis nouveau sur ant, vous l'aurez probablement deviné:).

Gav

Était-ce utile?

La solution

Il existe plusieurs façons de procéder. Le plus simple consiste simplement à utiliser deux instructions condition et à tirer parti de l'immuabilité de la propriété:

<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"/>

Ceci est un peu lourd et ne s'adapte pas bien, mais j'utiliserais probablement cette approche pour deux propriétés seulement.

Un meilleur moyen consiste à utiliser une cible conditionnelle:

<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>

Nous profitons à nouveau de l'immuabilité des propriétés ici. Si vous ne voulez pas faire cela, vous pouvez utiliser l'attribut sauf si et un niveau supplémentaire d'indirection:

<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>

Il est important de noter que les attributs if et sauf si de target vérifient uniquement si la propriété est définie, pas la valeur du paramètre. propriété.

Autres conseils

Vous pouvez utiliser la bibliothèque Ant-Contrib pour avoir accès à une syntaxe soignée < si > < puis > < else > , mais elle nécessitera quelques étapes de téléchargement / installation.

Voir cette autre question SO: tâche ant-contrib - if / then / else

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top