2012-09-20 26 views
7

Mi piacerebbe chiamare un determinato EXE dal mio script NAnt e passare una proprietà come argomento nel caso in cui la proprietà esista, o non passare nulla altrimenti.Come passare argomento all'attività exec NAnt in modo condizionale in base all'esistenza della proprietà?

Il codice qui sotto sembra adattarsi solo per questo caso, ma non funziona:

<exec program="notepad.exe"> 
    <arg line="${file}" if="${property::exists('file')}" /> 
</exec> 

E gettare Property 'file' has not been set errore. Sembra che valuti la proprietà ignorando la condizione. Mi aspetto che ignori l'intero elemento <arg> nel caso in cui la sua condizione sia false.

Se definisco la proprietà sopra questo blocco, ovviamente funziona correttamente (anche se la proprietà è vuota). Potrebbe valere una soluzione alternativa se si tratta di un singolo caso, ma devo passare un numero di proprietà allo stesso modo. Inoltre, <if> non è un elemento valido in <exec> ...

Come ottenere ciò? Qualche idea?

risposta

7

I Dag fuori an old thread at NAnt mailing list, che in realtà dà il miglior suggerimento per una soluzione alternativa (per il mio caso). Si basa sul fatto che l'attività <property> funziona come previsto. La soluzione alternativa introduce una proprietà aggiuntiva da impostare a seconda che la proprietà originale sia definita o meno.

Ti piace questa:

<target name="example"> 
    <property name="arg.value" value="${arg}" if="${property::exists('arg')}" /> 
    <property name="arg.value" value="" unless="${property::exists('arg')}" /> 
    <exec program="program.exe"> 
    <arg value="${arg.value}" /> 
    </exec> 
</target> 

Nel mio caso si scopre di essere più facile da impostare sempre una proprietà con valore di default, e addirittura non introdurre una proprietà in più - basta passare la proprietà originale per <arg/>:

<target name="example"> 
    <property name="arg.value" value="default value" overwrite="false" /> 
    <exec program="program.exe"> 
    <arg value="${arg.value}" /> 
    </exec> 
</target> 

Può (e verrà) essere sovrascritto in altri file di inclusione.

Ho anche trovato another thread where the same question was asked e una persona coinvolta nello sviluppo NAnt ha suggerito di indicare se le persone sono interessate a una patch per risolvere questo elemento per l'elemento <arg>. Per quanto posso vedere, nessuno ha dimostrato interesse :), quindi il comportamento non è stato modificato.

Sono riuscito a dedicare un po 'di tempo a indagare su quale potrebbe essere una correzione, e sembra che si tratta solo di aggiungere allo TaskAttribute per es. la proprietà line dell'attività <arg>. Lo stesso è fatto per l'attributo <property value="..."> dove funziona come previsto. Non l'ho provato, però - se avrò ancora un po 'di tempo uno di questi giorni, lo farò e pubblicherò un aggiornamento qui.

+0

Puoi opzionalmente impostare il valore predefinito della stessa variabile che stai leggendo. Questo sembra più chiaro ed è invece una singola affermazione. BradLaney

+0

In base al tuo caso d'uso, intendi quanto segue per il tuo secondo snippet di codice?

0

In questo caso, è sufficiente utilizzare un set di file per passare come argomenti. Per impostazione predefinita, set di file non include elementi che non corrispondevano ai file reali sul disco.

+0

Grazie per il suggerimento. Sfortunatamente, non si tratta solo di file: era solo un esempio. Devo passare un gran numero di argomenti, di varia natura. Formerò quello che ho finito con una risposta. –

0

Mi sono imbattuto in questo problema (a dire il vero anche più di una volta). L'attributo if in alcuni casi non funziona come ci si potrebbe aspettare. Questa è la mia brutta soluzione:

<choose> 
    <when test="${property::exists('file')}"> 
    <exec program="notepad.exe"> 
     <arg line="${file}" /> 
    </exec> 
    </when> 
    <otherwise> 
    <exec program="notepad.exe" /> 
    </otherwise> 
</choose> 
+0

Grazie per il tuo suggerimento. Bene, questo ha senso per 1 argomento - ma devo passare un gran numero di argomenti. Formerò quello che ho finito con una risposta. –

Problemi correlati