2013-11-20 5 views
6

In Ant 1.9.1, è possibile utilizzare if and unless attributes nella maggior parte delle attività.Ant if: true. L'impostazione della proprietà su true non comporterà l'esecuzione dell'operazione

Ho una macro ho definito dove sto cercando di eseguire queste operazioni:

<property name="test.templates"  value="true"/> 
.... 
<target name="test.templates" 
    description="Test the autoconfiguration templates and answers"> 
    <test.templates 
     if:true="test.templates" 
     template.root.dir="${main.dir}" 
     answers.dir="${main.config.dir}"/> 
</target> 

Tuttavia, questo non viene portato a termine Macro - anche se la proprietà test.templates è impostata su true. Se rimuovo quella linea, la mia macro test.template funzionerà.

C'è un problema nell'uso di if:true in una macro definita dall'utente? Qual è il modo migliore per aggirare questo problema?

+0

ho notato che hai un obiettivo, proprietà e macro tutte le chiamate "test.templates" –

+0

riempito un bug report dopo problema rimane con rilascio di nuove formiche dal 29 dicembre 2013 - vedi la mia risposta aggiornata EDIT (2) per i dettagli. – Rebse

+0

Soluzione trovata - guarda la mia risposta aggiornata EDIT (3)! – Rebse

risposta

7

Da ant manual:

Dal Ant 1.9.1 è possibile aggiungere se e meno che gli attributi su tutti compiti e gli elementi nidificati utilizzando namespace speciali.

non ha utilizzato il nuovo caso e se non gli attributi in una macrodef fino ad ora, ma il seguente frammento funziona:

<project xmlns:if="ant:if" xmlns:unless="ant:unless"> 

    <property name="foo" value="true"/> 

    <macrodef name="foobar"> 
    <attribute name="bla"/> 
    <attribute name="whentrue"/> 
    <sequential> 
     <echo if:true="${@{whentrue}}">@{bla}</echo> 
    </sequential> 
    </macrodef> 

    <echo>${ant.version}</echo> 
    <foobar whentrue="foo" bla="yada,yada"/> 

    </project> 

Avviso => ​​la sintassi di proprietà <echo if:true="${@{whentrue}}">, non funziona quando si utilizza solo @ {whentrue}.

uscita:

[echo] Apache Ant(TM) version 1.9.1 compiled on May 15 2013 
[echo] yada,yada 

altra mia prova:

<macrodef name="foobar" if:true="foo"> 
<attribute name="bla"/> 
<sequential> 
    <echo>@{bla}</echo> 
</sequential> 
</macrodef> 

<echo>${ant.version}</echo> 
<foobar bla="yada,yada"/> 

non ha funzionato:

... Problem: failed to create task or type foobar 
Cause: The name is undefined. 
Action: Check the spelling. 
Action: Check that any custom tasks/types have been declared. 
Action: Check that any <presetdef>/<macrodef> declarations have taken place. 

presume anche che qualcosa di simile potrebbe funzionare <foobar bla="yada,yada" if:true="foo"/>:

012.
<project xmlns:if="ant:if" xmlns:unless="ant:unless"> 

    <property name="foo" value="true"/> 

    <macrodef name="foobar"> 
    <attribute name="bla"/> 
    <sequential> 
    <echo>@{bla}</echo> 
    </sequential> 
    </macrodef> 

    <echo>${ant.version}</echo> 
    <foobar bla="yada,yada" if:true="foo"/> 

</project> 

uscita, nessun errore ma macrodef non viene eseguita:

[echo] Apache Ant(TM) version 1.9.1 compiled on May 15 2013 
BUILD SUCCESSFUL 

Sembra che ci sono ancora alcune incongruenze in quella zona, in quanto questa funzione è nuovo di zecca.
Forse dovremmo presentare un bug !?
- EDIT (1) -
Ha appena trovato un comment from 2007 by Peter Reilly (ha implementato la funzione if/unless) nel database dei bug form che fornisce uno snippet con macrodef.

- EDIT (2) -
Anche se il nuovo 1.9.3 rilascio Ant dal 29 dicembre, 2013 (see releasenotes here) fissato un bug relativo ai nuovi se: e meno che: attributi (https://issues.apache.org/bugzilla/show_bug.cgi?id=55885) il nostro problema rimane ancora . Così ho aperto una segnalazione di bug, vedi la banca dati dei bug delle formiche bugid 55971.

- EDIT (3) -
Infine, la soluzione è stata trovata. Accanto al bugfix per Bugid 55885 Ant Release 1.9.3 fornisce anche un bugfix per la documentazione del nuovo if: and unless: attributes =>Bugid 55359 che mostra che if:true="${propertyname}" invece di if:true="propertyname" deve essere usato.
Quindi la macro dovrebbe funzionare dopo l'aggiornamento a 1.9.3 Ant così:

<property name="test.templates"  value="true"/> 
.... 
<target name="test.templates" 
description="Test the autoconfiguration templates and answers"> 
    <test.templates 
    if:true="${test.templates}" 
    template.root.dir="${main.dir}" 
    answers.dir="${main.config.dir}"/> 
</target> 
+0

Grazie per tutto il lavoro che hai fatto! Stavamo usando '' di antcontrib, ma ho pensato che sarebbe stato un modo più elegante di gestire il problema, ma sono rimasto sorpreso quando non ha funzionato. –

+0

@Rebse: Sarebbe bello se hai modificato questa risposta per mettere la soluzione in alto anziché in basso (sotto diverse non-soluzioni). Se non fosse per il tuo "l'ho risolto!" commenta la domanda, avrei rinunciato alla tua risposta prima di arrivare alla fine. –

Problemi correlati