Quelle est la différence entre tous les projets et sous-projets

124

Sur une version gradle multi-projets, quelqu'un peut-il me dire quelle est exactement la différence entre la section «tous les projets» et celle «sous-projets»? Juste le répertoire parent? Quelqu'un utilise-t-il les deux? Dans l'affirmative, avez-vous des règles générales qui déterminent ce qui est généralement mis dans chacun d'eux?

Question connexe: quelle est la différence entre les deux syntaxes (vraiment pour tous les projets ET sous-projets):

subprojects {  ...
}

et

configure(subprojects) { ...
}

Quand voudriez-vous l'un sur l'autre?

JoeG
la source

Réponses:

119

Dans une génération gradle multi-projets, vous avez un rootProject et les sous-projets. La combinaison des deux est tous les projets. Le rootProject est le point de départ de la construction. Un modèle courant est qu'un rootProject n'a pas de code et les sous-projets sont des projets Java. Dans ce cas, vous appliquez le plugin java uniquement aux sous-projets:

subprojects {
    apply plugin: 'java'
} 

Cela équivaudrait à un projet pom agrégé maven qui ne construit que les sous-modules.

Concernant les deux syntaxes, elles font exactement la même chose. Le premier semble mieux.

Justin Ryan
la source
J'essaye de comprendre votre réponse, et pourquoi on voudrait "rootProject n'a pas de code"?
Marian Paździoch
6
Il peut avoir du code, mais la plupart du temps, c'est juste pour combiner tous les sous-projets sous un seul projet racine.
mallaudin
44

En plus de la réponse de Ryan, la configureméthode devient importante lorsque vous souhaitez configurer des sous-ensembles personnalisés d'objets. Par exemple configure([project(":foo"), project(":bar")]) { ... }ou configure(tasks.matching { it.name.contains("foo") }) { ... }.

Quand utiliser allprojectsou subprojectsdépend des circonstances. Vous utiliserez souvent les deux. Par exemple, les plugins liés au code comme le plugin Java sont généralement appliqués subprojects, car dans de nombreuses versions, le projet racine ne contient aucun code. Les plugins Eclipse et IDEA, en revanche, sont généralement appliqués à allprojects. En cas de doute, regardez des exemples et autres constructions et / ou expérimentations. L'objectif général est d'éviter une configuration non pertinente. En ce sens, subprojectsc'est mieux que allprojectstant qu'il donne les résultats escomptés.

Peter Niederwieser
la source
et si certains de mes sous-projets dépendent des tampons de protocole? devrais-je appliquer proto-gradle-plugin à tous? ou sous ou seulement à ces quelques projets en sous?
user1870400