2011-01-13 10 views
13

Sono piuttosto nuovo in Ant, ma ho sperimentato che è abbastanza buono per creare target di formiche generiche che devono essere richiamate con task antcall con parametri variabili.proprietà di passaggio definite all'interno di target di callback di nuovo al target di chiamata

Il mio esempio è un obiettivo di compilazione, che compila più sistemi utilizzando un comando di compilazione complesso che è leggermente diverso per ogni sistema. Utilizzando il modello descritto sopra è possibile non creare il codice copia-incolla per quel comando di compilazione.

Il mio problema è che non sono a conoscenza di alcun modo per passare il valore di ritorno (ad esempio il valore di ritorno del compilatore) al target che ha chiamato l'attività antcall. Quindi il mio approccio è patologico e semplicemente non è possibile restituire valore dal task antcall o conosci qualche soluzione alternativa?

Grazie,

+3

Ant fa schifo a questo genere di cose. Puoi prendere in considerazione Gradle, è molto più di un linguaggio e ha un'integrazione di prima classe con la logica Ant esistente. – skaffman

+0

le tue prime 3 parole sono importanti, il resto è irrilevante :) – Pavel

risposta

14

Utilizzare antcallback dal vaso ant-contrib invece di antcall

<target name="testCallback"> 
    <antcallback target="capitalize2" return="myKey"> 
    </antcallback> 
    <echo>a = ${myKey}</echo> 
</target> 

<target name="capitalize2"> 
    <property name="myKey" value="it works"/> 
</target> 

uscita:

testCallback: 

capitalize2: 
    [echo] a = it works 

BUILD SUCCESSFUL 
3

attività Ant sono tutti di roba entra, effetto collaterale accade. Quindi provare a programmare in termini di funzioni (le cose vanno, le cose escono) sarà disordinato.

Detto questo, è possibile generare un nome di proprietà per chiamata e memorizzare il valore risultato in quella proprietà. Dovresti passare un identificatore in modo da non finire cercando di creare copie della stessa proprietà. Qualcosa di simile a questo:

<target name="default"> 
    <property name="key" value="world"/> 
    <antcall target="doSomethingElse"> 
    <param name="param1" value="${key}"/> 
    </antcall> 
    <echo>${result-${key}}</echo> 
</target> 
<target name="doSomethingElse"> 
    <property name="hello-${param1}" value="it works?"/> 
</target> 

Ma credo che l'approccio più tipico -invece di antcalls- è quello di utilizzare le macro. http://ant.apache.org/manual/Tasks/macrodef.html

+5

Non funziona. Dalla documentazione di antcall: "I target richiamati vengono eseguiti in un nuovo progetto, si tenga presente che ciò significa che proprietà, riferimenti, ecc. Impostati dagli obiettivi chiamati non torneranno al progetto chiamante." –

+0

La macro è la strada da percorrere. – thekbb

5

Un approccio è scrivere una proprietà in un file temporaneo utilizzando "echo file = ...." o attività PropertyFile. Quindi leggi nuovamente la proprietà dove richiesto. Kludge ma funziona.

0

Antcall può essere utilizzato dal compito vaso ant-contrib.

Problemi correlati