2013-02-06 12 views
10

Próbuję utworzyć kompilację wieloelektową Gradle dla sytuacji, w której mój układ projektu jest już dla mnie podyktowany. Mam coś takiego:Trudności ze skonfigurowaniem kompilacji wielowyrobu Gradle dla istniejącego układu repozytoriów

-->Shared\ 
---->SharedComponent1\ 
------>build.gradle 
------>src\ 
... 
---->SharedComponent2\ 
------>build.gradle 
... 
-->Product1\ 
---->ProductComponent1\ 
------>build.gradle 
---->ProductComponent2\ 
------>build.gradle 
... 
---->build\ 
------>settings.gradle 

Moja settings.gradle wygląda tak:

rootProject.name = 'Product1' 
rootProject.projectDir = new File("${ProjectsRoot}") 

include 'Shared:SharedComponent1' 
include 'Shared:SharedComponent2' 
include 'Product1:ProductComponent1' 
include 'Product1:ProductComponent2' 

Kiedy biegnę Gradle w folderze build jak ten:

gradle -PProjectsRoot=c:\my\project\root\dir projects 

uzyskać:

:projects 

------------------------------------------------------------ 
Root project 
------------------------------------------------------------ 

Root project 'build' 
No sub-projects 

To see a list of the tasks of a project, run gradle <project-path>:tasks 
For example, try running gradle :tasks 

BUILD SUCCESSFUL 

tj. Nie znajduje rojects, które próbuję zbudować. Czy to, co próbuję osiągnąć dzięki obsłudze multiprojekcji Gradle? Czy mogę szczekać złe drzewo?

+0

Oto działający przykład, który działa z gradle2.2.1, ale nie z Androidem 1.0.2: http://stackoverflow.com/questions/18936433/relative-gradle-project-dependency-with-holoeverywhere/ – k3b

Odpowiedz

29

Kilka wskazówek:

  • Gradle ściśle oddziela logiczne hierarchii projektu (sposób Gradle organizuje build w logiczną hierarchię projektów) z katalogu układ fizyczny. Prawie każde mapowanie jest możliwe. (Jedynym wyjątkiem jest to, że nie można mieć dwóch projektów współużytkujących ten sam katalog projektu.)
  • Aby zaimplementować niestandardowy układ katalogu, musisz ustawić projectDir dla wszystkich projektów, a nie tylko dla projektu głównego. Powinieneś użyć ścieżek względnych, np. rootProject.projectDir = new File(settingsDir, "../foo") i project(":sub1").projectDir = new File(rootDir, "bar"). Tutaj, settingsDir odnosi się do katalogu zawierającego settings.gradle, a rootDir jest skrótem dla rootProject.projectDir.
  • Aby ogólnie skonfigurować projekty, można rekursywnie chodzić (root)Project.children. Zauważ, że settings.gradle i build.gradle używają różnych typów do reprezentowania projektu odpowiednio - ProjectDescriptor i Project.
  • Gradle należy wywołać z katalogu zawierającego settings.gradle lub jego podkatalogu. Z perspektywy użyteczności najlepiej jest umieścić settings.gradle w katalogu głównym hierarchii katalogów.

Aby uzyskać więcej informacji, zobacz Settings w Gradle Build Language Reference, a rozdział w podręczniku użytkownika Gradle Multi-Project Builds.

+0

Fantastyczny, Peter, dzięki. To rozwiązało całą masę nieporozumień, które miałem na temat tego, jak to działa. Zamieść następną odpowiedź poniżej pokazującą ostatni przykład, który zadziałałby dla mnie na wypadek, gdyby inni borykali się w tym samym obszarze. –

+0

Cieszę się, że pomogło.Korekta: zgodnie z dokumentami, właściwość ustawiona za pomocą -P jest również dostępna w skrypcie ustawień. Odpowiednio zredagowałem swoją odpowiedź. –

+0

Jedną z rzeczy, które pomogły mi ogromnie, było uświadomienie sobie, że plik settings.gradle powinien żyć tylko w głównym projekcie. – mooreds

11

Dla kompletności settings.gradle które rozwiązać mój konkretny przykład powyżej przedstawia się następująco:

rootProject.name = 'Product1' 

def projectTreeRootDir = new File("${ProjectsRoot}") 

// Shared components 

def sharedRootDir = new File(projectTreeRootDir, 'Shared') 

include ':SharedComponent1' 
project(':SharedComponent1').projectDir = new File(sharedRootDir, 'SharedComponent1') 

include ':SharedComponent2' 
project(':SharedComponent2').projectDir = new File(sharedRootDir, 'SharedComponent2') 

// Product components 

includeFlat 'ProductComponent1', 'ProductComponent2' 

Oczywiście to nie skaluje się do dużej liczby podprojektów i można to zrobić znacznie lepiej przy użyciu wskazówek dostarczonych przez Piotra powyżej.

Powiązane problemy