Was ist der Unterschied zwischen allen Projekten und Teilprojekten?

124

Kann mir jemand sagen, was genau der Unterschied zwischen dem Abschnitt "allprojects" und dem Abschnitt "subprojects" ist? Nur das übergeordnete Verzeichnis? Verwendet jemand beides? Wenn ja, haben Sie allgemeine Regeln, die bestimmen, was normalerweise in jedem enthalten ist?

Verwandte Frage: Was ist der Unterschied zwischen den beiden Syntaxen (wirklich für alle Projekte UND Teilprojekte):

subprojects {  ...
}

und

configure(subprojects) { ...
}

Wann würdest du eins über das andere?

JoeG
quelle

Antworten:

119

In einem Gradle-Build für mehrere Projekte haben Sie ein rootProject und die Unterprojekte. Die Kombination von beiden ist allprojects. Im rootProject beginnt der Build. Ein häufiges Muster ist, dass ein rootProject keinen Code hat und die Unterprojekte Java-Projekte sind. In diesem Fall wenden Sie das Java-Plugin nur auf die Teilprojekte an:

subprojects {
    apply plugin: 'java'
} 

Dies wäre gleichbedeutend mit einem Maven-Aggregat-POM-Projekt, bei dem nur die Untermodule erstellt werden.

In Bezug auf die beiden Syntaxen machen sie genau dasselbe. Der erste sieht einfach besser aus.

Justin Ryan
quelle
Ich versuche Ihre Antwort zu verstehen und warum sollte man "rootProject hat keinen Code" wollen?
Marian Paździoch
6
Es kann Code enthalten, dient jedoch meistens nur zum Kombinieren aller Unterprojekte unter einem einzigen Stammprojekt.
Mallaudin
44

Neben Ryans Antwort wird die configureMethode wichtig, wenn Sie benutzerdefinierte Teilmengen von Objekten konfigurieren möchten. Zum Beispiel configure([project(":foo"), project(":bar")]) { ... }oder configure(tasks.matching { it.name.contains("foo") }) { ... }.

Wann zu verwenden allprojectsvs. subprojectshängt von den Umständen ab. Oft werden Sie beide verwenden. Beispielsweise werden Code-bezogene Plugins wie das Java-Plugin normalerweise angewendet subprojects, da das Root-Projekt in vielen Builds keinen Code enthält. Die Eclipse- und IDEA-Plugins werden normalerweise angewendet allprojects. Schauen Sie sich im Zweifelsfall Beispiele und andere Builds an und / oder experimentieren Sie. Das allgemeine Ziel ist es, irrelevante Konfigurationen zu vermeiden. In diesem Sinne subprojectsist besser als allprojectssolange es die erwarteten Ergebnisse liefert.

Peter Niederwieser
quelle
Was ist, wenn einige meiner Unterprojekte von Protokollpuffern abhängen? soll ich proto-gradle-plugin auf alle anwenden? oder sub oder nur zu diesen wenigen Projekten in sub?
user1870400