2012-06-22 23 views
10

Quando si applica una struttura multi progetto Gradle al nostro progetto, i miei settings.gradle assomiglia a questo:Gradle Multi Project costruire con progetti vuoti

include "source:compA:api" 
include "source:compA:core" 
include "source:compB" 

progetti Gradle mi danno

Root project 'tmp' 
\--- Project ':source' 
    +--- Project ':source:compA' 
    | +--- Project ':source:compA:api' 
    | \--- Project ':source:compA:core' 
    \--- Project ':source:compB' 

Questa è esattamente la struttura della directory!
Nel mio directory principale Ho un build.gradle quale si applica il plugin Java per tutti i sottoprogetti:

subprojects { 
    apply plugin: 'java' 
} 

Quando si costruisce finisco per avere artefatti per : fonte: COMPA che sono vuoti, perché questo è in realtà non è un progetto solo le sottodirectory api e core sono progetti java corretti.

Qual è il modo migliore per evitare di avere un artefatto vuoto?

+0

Perché non basta applicare il plugin Java all'api e al core nei rispettivi script? –

+0

Potrei farlo, ma la mia attuale struttura del progetto è molto più nidificata, con molti progetti. Penso che questo sia un problema comune per le strutture di progetto legacy. E sto cercando una soluzione flessibile, in cui ogni progetto non abbia bisogno di sapere molto sul processo di costruzione in cui vive. – VolkerK

+0

IMHO il sottomodulo dovrebbe sapere esplicitamente che si tratta di un progetto Java. Ciò renderà molto più espressivo per chiunque lo guardi che dichiarare questa informazione a livello di root. –

risposta

14

Puoi provare a usare il trucco che usano nel file Gradle's own settings.gradle. Notare come ciascuno dei sottoprogetti si trova nella cartella 'subprojects/${projectName}', ma la cartella subprojects non è un progetto.

Quindi nel tuo caso si farebbe qualcosa di simile:

include "source:compA-api" 
include "source:compA-core" 
include "source:compB" 

project(':source:compA-api').projectDir = new File(settingsDir, 'source/compA/api') 
project(':source:compA-core').projectDir = new File(settingsDir, 'source/compA/core') 

Ho volutamente omesso i due punti tra il compA e api per assicurarsi source:compA non venga valutato come un contenitore di progetto.

In alternativa, si può provare ad esclusione progetto source:compA di avere il plugin java applicato ad esso, facendo qualcosa di simile:

def javaProjects() { 
    return subprojects.findAll { it.name != 'compA' } 
} 

configure(javaProjects()) { 
    apply plugin: 'java' 
} 

Edit: In alternativa si può provare qualcosa di simile (adatta al vostro Mi piace):

def javaProjects() { 
    return subprojects.findAll { new File(it.projectDir, "src").exists() } 
} 

configure(javaProjects()) { 
    apply plugin: 'java' 
} 
+0

Grazie per la tua risposta. Speravo in qualcosa di simile a un'impostazione 'skipIfEmpty'. – VolkerK

+0

È possibile ottenere qualcosa di equivalente a questo personalizzando la clausola 'findAll'. Vedi la modifica sopra. – rodion

+0

Questa è una buona soluzione. Devo ancora abituarmi al fatto che i file build sono script groovy;) – VolkerK

Problemi correlati