2012-01-26 11 views
7

Quindi, ecco la situazione: ho un file di generazione padre che definisce un'attività di compilazione e voglio che i file di build figlio possano facoltativamente aggiungere altri JAR (che potrebbero essere ovunque) sul classpath usato da quell'attività di compilazione.Creazione di un set di file segnaposto vuoto in Ant

Non tutti i file di build figlio avranno queste dipendenze aggiuntive, quindi non voglio forzarli a definire il set di file di dipendenza aggiuntivo. Dovrebbero essere in grado di includere il genitore e l'attività di compilazione dovrebbe funzionare.

(Ovviamente ci sono altre proprietà necessarie che configurano la directory di origine e così via, ma non entrano in questa. Inoltre, il problema di inclusione/ereditarietà è un po 'più complicato, ma spero che sia la cosa giusta è per il caso semplice funzionerà nel caso complesso troppo)

ho qualcosa che funziona. il compito di compilazione nella BuildFile genitore si riferisce alla ulteriore set di file di dipendenza a prescindere:

<target name="compile" depends="init-additional-dependencies"> 
    <fileset id="global.dependency.fileset" dir="${global.library.directory}"> 
    <include name="**/*.jar"/> 
    </fileset> 
    <javac ...> 
    <classpath> 
     <!-- should be the same for all buildfiles --> 
     <fileset refid="global.dependency.fileset"/> 

     <!-- should be populated by child buildfiles --> 
     <fileset refid="additional.dependency.fileset"/> 
    </classpath> 
    </javac> 
</target> 

... e il buildfile padre ha anche un'attività che crea questo set di file, vuoto, in modo che javac non esploda. Tuttavia, il modo in cui sto creando il set di file vuoto è stupida:

<target name="init-additional-dependencies"> 
    <!-- override me! --> 
    <fileset id="additional.dependency.fileset" dir="."> 
    <include name="placeholder.does.not.exist.so.fileset.is.empty"/> 
    </fileset> 
</target> 

Questo funziona, ma sembra muto, ed è difficile credere che non ci sia un approccio migliore. Qual è l'approccio migliore?

+0

Molto interessante domanda +1 . Il problema è che il tuo dirset usa "." che esistono sempre. Se hai un qualche tipo sulla convenzione di denominazione su dove tenere i jar di dipendenza aggiuntivi (ad esempio ./deps/), potresti creare dirset con 'erroronmissingdir = false'. – Jayan

risposta

3

Non penso ci sia stata molta discussione su questo, quindi non esiste una "convenzione" in quanto tale. Il modo in cui funziona però set di file, esclusioni 'vincente' inclusioni, così

<fileset refid="additional.dependency.fileset" dir="." excludes="**" /> 

deve sempre essere vuota. Ciò sembra leggermente preferibile sia alla tecnica del nome del file del segnaposto, sia al nome della directory del segnaposto e al metodo erroronmissingdir.

Il problema si pone perché, per impostazione predefinita, esiste un inclusione implicita di tutti i file sotto la directory principale di un set di file. Un'altra opzione - forse non di uso diretto nel tuo caso - è di utilizzare un filelist invece. Poiché le fileliste sono costruite da file con nome esplicito, se non ne nominate alcuno, sono vuoti.

<filelist id="additional.dependency.filelist" /> 

generalizzando, si possono mescolare i set di file e filelists, se si modifica il percorso di classe per utilizzare resources:

<filelist id="additional.dependency.resources" /> 

... 

<classpath> 
     <!-- should be the same for all buildfiles --> 
     <fileset refid="global.dependency.fileset"/> 

     <!-- should be populated by child buildfiles --> 
     <resources refid="additional.dependency.resources"/> 
</classpath> 

il riferimento additional.dependency.resources può essere o un set di file o un filelist (compresa la lista dei file vuoto) o qualsiasi altro file-based resource collection.

0

Nel file di generazione del padre aggiuntivo:

<fileset id="additional.dependency.fileset" erroronmissingdir="false" dir="noop" /> 

Per i bambini che necessitano di manufatti supplementari da aggiungere, definire il set di file nel file secondario di generazione:

<fileset id="additional.dependency.fileset" dir="..." includes="..." /> 
Problemi correlati