2009-10-24 5 views
13

Sto tentando di assegnare due stringhe diverse a due variabili diverse dipendenti da due valori booleani in Ant.Ant (1.6.5) - Come impostare due proprietà in uno <condition> o <if>

Pseudocodice (ish):

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

Quello che ho provato è;

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

ma ottengo un'eccezione di puntatore nullo per la riga che contiene "<if>". Posso farlo funzionare con i tag <condition property=...> ma è possibile impostare solo una proprietà alla volta. Ho provato a utilizzare <propertyset> ma non era consentito neanche.

Sono nuovo per la formica come avrete probabilmente intuito :).

Gav

risposta

34

Ci sono diversi modi per farlo. Il più semplice è usare solo due condition dichiarazioni, e approfittare di proprietà immutabilità:

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

Questo è un po 'ingombrante e non scala bene, ma solo per due proprietà Io probabilmente utilizzare questo approccio.

Un modo un po 'meglio è quello di utilizzare un obiettivo condizionale:

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

Siamo di nuovo approfittando della proprietà immutabilità qui. Se non si vuole fare questo, è possibile utilizzare l'attributo unless, e un ulteriore livello di indirezione:

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

E 'importante notare che i if e unless attributi di target verificare solo se la proprietà è impostare, non il valore della proprietà.

+2

Grazie, risposta completa. – gav

+0

Proprio quello di cui avevo bisogno. Grazie per avere il tuo cervello su Ant, nel '09. –

1

È possibile utilizzare la libreria Ant-Contrib per accedere a una sintassi corretta <if><then><else>, tuttavia sono necessari alcuni passaggi di download/installazione.

Vedi questa altra domanda SO: ant-contrib - if/then/else task