2017-05-15 26 views
9

biegnę do tego samego problemu jak donosi here:Jak zezwolić/obejście zagnieżdżone kompozytowych Gradle buduje

Mam projektu Java, która zależy od projektu (moduł B) oraz dependes Projekt B w projekcie C (inny moduł). Dla projektu AI chciałbyś ustawić "includeBuild ../projectB", a dla projektu BI chciałbyś ustawić "includeBuild ../projectC", aby móc rozwijać wszystko w Eclipse + Buildship 2.0 bez potrzeby uruchamiania Gradle za każdą małą zmianę w każdym z projektów A, B i C.

Ale jeśli to skonfiguruję, otrzymam: "Dołączona kompilacja"% s "nie mogła zawierać kompilacji .".

Oczekiwany Zachowanie

rekurencyjne "includeBuild" będzie rekurencyjnie obejmować projekty zależne.

Aktualny Zachowanie

otrzymuję "wliczony build '% s' nie może być uwzględniony buduje.".

Twój Środowisko

Gradle 3.5, 2.0, Eclipse Buildship 3,6

Jak mogę rozwiązać/obejść ten problem? W mojej instancji mam projekt narzędzia, który zawiera funkcję e-mail (przy użyciu JavaMail). Funkcja poczty elektronicznej jest potrzebna w projekcie danych i projekcie interfejsu użytkownika. Projekt UI zależy również od projektu danych.

Odpowiedz

7

Dodanie kolejnego odpowiedź na innym podejściu ...

Każdy settings.gradle mógł dodać czek przed includeBuild aby sprawdzić, czy jest już w kompozycie. Jeśli znajduje się już w kompozycie, nie jest to includeBuild.

Zobacz here dodatkowych informacji na kompozytowej czeku

Np

project2/settings.gradle

boolean inComposite = gradle.parent != null 
if (!inComposite) { 
    includeBuild '../project1' 
} 

project3/settings.gradle

boolean inComposite = gradle.parent != null 
if (!inComposite) { 
    includeBuild '../project1' 
    includeBuild '../project2' 
} 

project4/settings.gradle

boolean inComposite = gradle.parent != null 
if (!inComposite) { 
    includeBuild '../project1' 
    includeBuild '../project2' 
    includeBuild '../project3' 
} 

etc etc

Stosując to podejście można uruchomić gradle od gdziekolwiek chcesz i powinien zachowywać się zgodnie z oczekiwaniami (tj zależności zastępcze z lokalnych projektów)

+0

. Bardzo dziękuję, obie odpowiedzi są dobre. – The6thSense

3

Czy uważane

  1. Zapewnienie, że żaden z jednostki buduje są kompozytowy buduje
  2. posiadające „uber” build który jest połączeniem wszystkiego

Zauważ, że settings.gradle jest sama świetny skrypt, więc możesz utworzyć dynamiczny kompozyt, np. wszystkie podfoldery z build.gradle pod rodzicem.

uber/settings.gradle

new File("c:/someFolder").listFiles().each { File f -> 
    if (f.directory && new File(f, 'build.gradle').exists()) { 
     includeBuild f 
    } 
} 

Np

c:/someFolder/project1/build.gradle 
c:/someFolder/project1/src/main/java/**/*.java 
c:/someFolder/project2/build.gradle 
c:/someFolder/project2/src/main/java/**/*.java 
c:/uber/settings.gradle (as above) 
+0

Właściwie to jest trochę mylące. Czy możesz wykazać za pomocą struktury folderów. Podejmowanie powyżej przypadku jako przykładu. Z góry dziękuję – The6thSense

+0

Zobacz przykładową strukturę folderów. Zasadniczo można by wykonać wszystkie indywidualne projekty we wspólnym folderze. Następnie kompilacja 'uber' skomponowałaby je wszystkie razem. Jeśli chcesz umieścić projekt 'uber' w tym samym folderze, możesz dodać wykluczenie dla niego w' settings.gradle', aby zatrzymać to samo w sobie –

+0

Dzięki za wyjaśnienie. Ale w ten sposób nie mogę zaliczyć projektu1 jako zależności do prawa projektu2. – The6thSense