2009-10-24 5 views
13

J'essaye d'assigner deux chaînes différentes à deux variables différentes dépendantes de deux booléens dans Ant.Ant (1.6.5) - Comment définir deux propriétés dans un <condition> ou <if>

pseudocode (ish):

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

Ce que j'ai essayé 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 je reçois une exception de pointeur nul pour la ligne contenant « <if> ». Je peux le faire fonctionner en utilisant les balises <condition property=...> mais ne peux définir qu'une seule propriété à la fois. J'ai essayé d'utiliser <propertyset> mais ce n'était pas autorisé non plus.

Je suis nouveau à fourmi comme vous l'aurez probablement deviné :).

Gav

Répondre

34

Il existe plusieurs façons de procéder. Le plus simple est d'utiliser simplement deux déclarations condition, et bénéficier de la propriété immuabilité:

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

C'est un peu lourd et est redimensionnée pas bien, mais pour seulement deux propriétés je serais probablement utiliser cette approche.

Un peu mieux est d'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 encore de la propriété immuabilité ici. Si vous ne voulez pas le faire, vous pouvez utiliser l'attribut unless, 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 de if et unlesstarget ne vérifier si la propriété est définir, pas la valeur de la propriété.

+2

Merci, réponse complète. – gav

+0

Juste ce dont j'avais besoin. Merci d'avoir votre cerveau sur Ant, de retour en '09. –

1

Vous pouvez utiliser la bibliothèque Ant-Contrib pour avoir accès à une syntaxe soignée <if><then><else>, mais il faudra quelques étapes de téléchargement/installation.

Voir cette autre question SO: ant-contrib - if/then/else task

Questions connexes