Qual è la differenza tra allprojects e subprojects


124

Su una build gradle multi-progetto, qualcuno può dirmi qual è esattamente la differenza tra la sezione "allprojects" e quella "sottoprogetti"? Solo la directory principale? Qualcuno li usa entrambi? In caso affermativo, hai regole generali che determinano cosa viene solitamente inserito in ciascuna di esse?

Domanda correlata: qual è la differenza tra le due sintassi (in realtà per tutti i progetti E i sottoprogetti):

subprojects {  ...
}

e

configure(subprojects) { ...
}

Quando vorresti uno sull'altro?

Risposte:


119

In una build gradle multi-progetto, hai un rootProject e i sottoprogetti. La combinazione di entrambi è allprojects. Il rootProject è il punto da cui parte la build. Un modello comune è che rootProject non ha codice e i sottoprogetti sono progetti Java. In tal caso, applichi il plugin java solo ai sottoprogetti:

subprojects {
    apply plugin: 'java'
} 

Questo sarebbe equivalente a un progetto pom aggregato maven che costruisce solo i sottomoduli.

Per quanto riguarda le due sintassi, fanno esattamente la stessa cosa. Il primo sembra solo migliore.


Sto cercando di capire la tua risposta, e perché si vorrebbe "rootProject non ha codice"?
Marian Paździoch

6
Può contenere codice ma il più delle volte serve solo per combinare tutti i sottoprogetti in un unico progetto radice.
mallaudin

44

Aggiungendo alla risposta di Ryan, il configuremetodo diventa importante quando si desidera configurare sottoinsiemi personalizzati di oggetti. Ad esempio configure([project(":foo"), project(":bar")]) { ... }o configure(tasks.matching { it.name.contains("foo") }) { ... }.

Quando usare allprojectsvs. subprojectsdipende dalle circostanze. Spesso utilizzerai entrambi. Ad esempio, i plug-in relativi al codice come il plug-in Java vengono generalmente applicati subprojects, poiché in molte build il progetto radice non contiene alcun codice. I plugin Eclipse e IDEA, d'altra parte, vengono tipicamente applicati a allprojects. In caso di dubbio, guarda esempi e altre build e / o esperimenti. L'obiettivo generale è evitare configurazioni irrilevanti. In questo senso, subprojectsè meglio che allprojectsa patto che dia i risultati attesi.


cosa succede se alcuni dei miei sottoprogetti dipendono dai buffer di protocollo? dovrei applicare proto-gradle-plugin a tutti? o sub o solo a quei pochi progetti in sub?
user1870400
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.