2009-05-04 4 views
7

Ho un progetto con più moduli, ciascuno nella propria directory. Ogni modulo ha il proprio file di build ant (build.xml)Passa il target della formica a più file build.xml nelle sottodirectory

Nella directory radice ho impostato un file di generazione generale che chiama il file di costruzione di ciascun modulo nell'ordine corretto.

<?xml version="1.0"?> 
<project name="bridgedb" default="all" basedir="."> 
    <target name="all"> 
    <ant dir="corelib"/> 
    <ant dir="tools"/> 
    <ant dir="makeGdb"/> 
    <ant dir="cytoscape-plugin"/> 
    </target> 
</project> 

Ora ogni modulo ha anche un obiettivo "pulito", in modo da aggiungere queste righe:

<target name="clean"> 
    <ant dir="corelib" target="clean"/> 
    <ant dir="tools" target="clean"/> 
    <ant dir="makeGdb" target="clean"/> 
    <ant dir="cytoscape-plugin" target="clean"/> 
    </target> 

E ci sono più bersagli del genere. C'è un modo per riscrivere il file di build per evitare questa duplicazione? Ho cercato una proprietà built-in che contenga il target attivo, ma non ho potuto trovarlo.

risposta

7

Perché non utilizzare antcall per chiamare un obiettivo che fa riferimento a tutti i sottodir e parametrizzare il target da chiamare. per esempio.

<antcall target="doStuffToSubdirs"> 
    <!-- let's clean --> 
    <param name="param1" value="clean"/> 
    </antcall> 

e poi:

<target name="doStuffToSubdirs"> 
    <ant dir="corelib" target="${param1}"/> 
    <ant dir="tools" target="${param1}"/> 
    ...etc 
</target> 

quindi questo permette di parametrizzare le chiamate ai vostri subdirs. Se aggiungi una nuova sottodirectory, devi solo aggiungere la sottodir al target "doStuffToSubdirs" (anch'io lo cambierei anche io!)

+0

Sì, funziona, grazie. – amarillion

+0

sebbene dovrebbe essere amarillion

+0

Lo correggo ora. Grazie per il testa a testa (confesso di non averlo provato :-) –

2

mettere un bersaglio pulita nel vostro commonbuild.xml e nel bambino file basta importare il build.xml genitore

<import file="${parent.dir}/commonbuild.xml" /> 

Ora sarete in grado di chiamare il target pulita nel vostro bambino costruisce. Puoi anche ignorare questo obiettivo creando un bersaglio pulito in qualsiasi build figlio.

+0

Se ho capito bene, questo presuppone che il target "clean" faccia esattamente lo stesso cosa in ogni sottodirectory. Ma non è questo il caso, soprattutto non per altri obiettivi che potrei desiderare di chiamare nello stesso modo. – amarillion

+0

Hai ragione ho frainteso la tua domanda. –

+0

np, anche questo è un trucco utile che potrei usare un altro giorno :) – amarillion