Ant (1.6.5) - Comment définir deux propriétés dans une < condition > ou < if >
-
06-07-2019 - |
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
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