Jaka jest różnica między wszystkimi projektami a podprojektami

124

Czy ktoś może mi powiedzieć, jaka jest różnica między sekcją „wszystkie projekty” a sekcją „podprojekty” w przypadku kompilacji z wieloma projektami? Tylko katalog nadrzędny? Czy ktoś używa obu? Jeśli tak, czy masz ogólne zasady, które określają, co jest zwykle umieszczane w każdym z nich?

Powiązane pytanie: jaka jest różnica między tymi dwoma składniami (tak naprawdę dla wszystkich projektów ORAZ podprojektów):

subprojects {  ...
}

i

configure(subprojects) { ...
}

Kiedy byłbyś jeden nad drugim?

JoeG
źródło

Odpowiedzi:

120

W kompilacji gradle z wieloma projektami masz rootProject i podprojekty. Połączenie obu to wszystkie projekty. RootProject to miejsce, w którym rozpoczyna się kompilacja. Typowym wzorcem jest to, że rootProject nie ma kodu, a podprojekty są projektami Java. W takim przypadku należy zastosować wtyczkę java tylko do podprojektów:

subprojects {
    apply plugin: 'java'
} 

Byłoby to równoważne z projektem maven agregatu pom, który po prostu buduje podmoduły.

Jeśli chodzi o dwie składnie, robią dokładnie to samo. Pierwsza po prostu wygląda lepiej.

Justin Ryan
źródło
Próbuję zrozumieć twoją odpowiedź i dlaczego ktoś miałby chcieć, aby „rootProject nie miał kodu”?
Marian Paździoch
6
Może zawierać kod, ale najczęściej służy do łączenia wszystkich podprojektów w ramach jednego projektu głównego.
mallaudin
44

Dodając do odpowiedzi Ryana, configuremetoda staje się ważna, gdy chcesz skonfigurować niestandardowe podzbiory obiektów. Na przykład configure([project(":foo"), project(":bar")]) { ... }lub configure(tasks.matching { it.name.contains("foo") }) { ... }.

Kiedy używać, allprojectsa kiedy subprojectszależy od okoliczności. Często będziesz używać obu. Na przykład wtyczki związane z kodem, takie jak wtyczka Java, są zwykle stosowane do subprojects, ponieważ w wielu kompilacjach projekt główny nie zawiera żadnego kodu. Z drugiej strony wtyczki Eclipse i IDEA są zwykle stosowane do allprojects. W razie wątpliwości spójrz na przykłady i inne kompilacje i / lub eksperyment. Ogólnym celem jest uniknięcie nieistotnej konfiguracji. W tym sensie subprojectsjest lepsze niż allprojectstak długo, jak długo daje oczekiwane rezultaty.

Peter Niederwieser
źródło
co jeśli niektóre z moich podprojektów zależą od buforów protokołów? czy powinienem zastosować wtyczkę proto-gradle we wszystkich? czy sub, czy tylko do tych kilku projektów w sub?
user1870400