2012-06-22 6 views
10

Przy stosowaniu multi strukturę Gradle projekt do naszego projektu, mój settings.gradle wygląda następująco:Gradle wielo projekt budowy z pustymi projektów

include "source:compA:api" 
include "source:compA:core" 
include "source:compB" 

Gradle projektów dać mi

Root project 'tmp' 
\--- Project ':source' 
    +--- Project ':source:compA' 
    | +--- Project ':source:compA:api' 
    | \--- Project ':source:compA:core' 
    \--- Project ':source:compB' 

To jest dokładnie struktura katalogów!
W moim katalogu Mam build.gradle którego stosuje się wtyczki java do wszystkich podprojektów:

subprojects { 
    apply plugin: 'java' 
} 

Przy budowie I w końcu o artefakty dla : źródło: Compa które są puste, ponieważ jest to w rzeczywistości nie są to projekty, które są poprawnymi projektami java.

Jaki jest najlepszy sposób na uniknięcie pustego artefaktu?

+0

Dlaczego po prostu nie zastosujesz wtyczki Java do api i core w swoich skryptach? –

+0

Mogę to zrobić, ale moja rzeczywista struktura projektu jest znacznie bardziej zagnieżdżona, z wieloma projektami. Myślę, że jest to powszechny problem w przypadku starszych struktur projektu. I szukam elastycznego rozwiązania, w którym każdy projekt nie musi wiele wiedzieć o procesie kompilacji, w którym żyje. – VolkerK

+0

IMMO moduł musi wyraźnie wiedzieć, że jest to projekt Java. To sprawi, że będzie on dużo bardziej wyrazisty dla każdego, kto na niego patrzy, niż deklarowanie tych informacji na poziomie root. –

Odpowiedz

14

Możesz spróbować użyć sztuczki, której używają w pliku Gradle's own settings.gradle. Zwróć uwagę, że każdy z podrzędnych projektów znajduje się w folderze 'subprojects/${projectName}', ale sam folder subprojects nie jest projektem.

Więc w twoim przypadku, że można zrobić coś takiego:

include "source:compA-api" 
include "source:compA-core" 
include "source:compB" 

project(':source:compA-api').projectDir = new File(settingsDir, 'source/compA/api') 
project(':source:compA-core').projectDir = new File(settingsDir, 'source/compA/core') 

ja celowo pominięte dwukropek między compA i api aby upewnić source:compA nie zostanie oceniona jako pojemnik projektu.

Alternatywnie, można spróbować z wyłączeniem projektu source:compA od konieczności plugin java zastosować do niego, robiąc coś takiego:

def javaProjects() { 
    return subprojects.findAll { it.name != 'compA' } 
} 

configure(javaProjects()) { 
    apply plugin: 'java' 
} 

Edit: Alternatywnie można spróbować coś takiego (dostosowanie do listy polubienie):

def javaProjects() { 
    return subprojects.findAll { new File(it.projectDir, "src").exists() } 
} 

configure(javaProjects()) { 
    apply plugin: 'java' 
} 
+0

Dziękuję za odpowiedź. Miałem nadzieję na coś takiego jak ustawienie 'skipIfEmpty'. – VolkerK

+0

Możesz osiągnąć coś podobnego dzięki dostosowaniu klauzuli "findAll". Zobacz powyższą edycję. – rodion

+0

To dobre rozwiązanie. Nadal muszę się przyzwyczajać do faktu, że pliki buildfile są groovymi skryptami;) – VolkerK