2014-10-22 16 views
26

Ho un progetto gradle MultiModule che sto cercando di configurare.Esegui attività gradle su sottoprogetti

Root 
    projA 
    projB 
    other 
     projC 
     projD 
     projE 
     ... 

Vuoi Voglio essere in grado di fare è di avere un compito nel build.gradle radice che eseguirà il compito buildJar in ciascuno dei progetti in altre directory.

so che posso fare

configure(subprojects.findAll {it.name != 'tropicalFish'}) { 
    task hello << { task -> println "$task.project.name"} 
} 

ma questo sarà anche ottenere proja e projB, voglio correre solo il compito su c, d, e ... prega fatemi sapere il modo migliore per raggiungere questo.

risposta

32

Non sono sicuro di quale di questi cerchi, ma dovrebbero coprire le tue basi.

1. Richiamo dei compiti direttamente

Si dovrebbe solo essere in grado di chiamare

gradle :other/projC:hello :other/projD:hello 

Ho provato questo con:

# Root/build.gradle 
allprojects { 
    task hello << { task -> println "$task.project.name" } 
} 

e

# Root/settings.gradle 
include 'projA' 
include 'projB' 
include 'other/projC' 
include 'other/projD' 

2. Solo la creazione di attività nei sottoprogetti

O è solo che si desidera l'attività creata negli altri/* progetti?

In quest'ultimo caso, poi le seguenti opere:

# Root/build.gradle 
allprojects { 
    if (project.name.startsWith("other/")) { 
     task hello << { task -> println "$task.project.name" } 
    } 
} 

e può quindi essere chiamato con:

$ gradle hello 
:other/projC:hello 
other/projC 
:other/projD:hello 
other/projD 

3. Creazione di un'attività che esegue le attività nei sottoprogetti solo

Questa versione corrisponde alla mia lettura della domanda indicando che esiste già un'attività nei sottoprogetti (buildJar) e la creazione di un'attività in radice che chiamare solo i sottoprogetti altra/*: buildJar

allprojects { 
    task buildJar << { task -> println "$task.project.name" } 
    if (project.name.startsWith("other/")) { 
     task runBuildJar(dependsOn: buildJar) {} 
    } 
} 

Questo crea un compito "buildJar" su ogni progetto, e "runBuildJar" sugli altri/* progetti solo, in modo da poter chiamare:

$ gradle runBuildJar 
:other/projC:buildJar 
other/projC 
:other/projC:runBuildJar 
:other/projD:buildJar 
other/projD 
:other/projD:runBuildJar 

la tua domanda può essere letto molti modi, spero che questo copre tutti :)

+0

Grazie per la risposta. Nessuna delle opzioni soddisfa le mie esigenze: 1. Abbiamo bisogno di conoscere l'elenco di tutti i sottoprogetti. 2 + 3. Lo script di compilazione deve essere modificato. Alla fine, ho trovato un altro modo per raggiungere questo obiettivo e l'ho aggiunto come una nuova risposta. – Marwin

+0

@ Marwin: dov'è la tua risposta? Sarebbe interessato – frhd

+0

@frhd Vedere la risposta qui di seguito 'gradle -p other hello' –

22

ho scoperto questa domanda oggi, perché ho lo stesso problema. Tutti i modi menzionati da Mark possono essere utilizzati, ma tutti hanno alcuni svantaggi. Quindi aggiungo un'altra opzione:

4.Commutazione del progetto corrente

gradle -p other hello 

questo modo si passa il "progetto corrente" e quindi esegue tutte le attività denominate hello nell'ambito del progetto corrente.