Gradle и мульти-проект структура
Я пытаюсь понять, как мне подойти к следующей настройке проекта:
┌Top Android Project
│
├── Project 1 - (Pure Java Modules)
│ │
│ ├── Module A1
│ ├── Module B1
│ :
│ └── Module Z1
│
├── Project 2 - (Android Libraries Modules)
│ │
│ ├── Module A2
│ ├── Module B2
│ :
│ └── Module Z2
│
└── Module - Actual Android Project
в текущей настройке у меня есть сборка.gradle в каждом из модулей, что я действительно ненавижу в этой настройке, так это все содержимое сборки.gradle дублируется между модулями.
факт в том, что я хотел бы, чтобы та же логика была в большинстве из них,'Чистые Модули Java ' все модули infra, которые я хотел бы Jar выход, JavaDoc и источники и развертывание в некотором удаленном репозитории (*по умолчанию).
С другой стороны, некоторые модули 'Чистые Модули Java ' Я хотел бы иметь вторую повестку дня, например, помимо сборки по умолчанию* я хотел бы развернуть jar с зависимостями для конкретного проекта или что-то в этом роде.
при строительстве Фактический Проект Android, Я хотел бы, чтобы модули компилировались в сборке по умолчанию* и, наконец, для настройки по умолчанию строить.gradle для всех моих проектов Android, которых довольно много, и я не хотел бы дублировать этот файл.
===============================================================
Я думаю, что я ищу что-то вроде Maven parent pom, но так как я не совсем понимаю, как работает Gradle, я открываю это для вас, ребята, чтобы поделиться своими мыслями...
принимая во внимание, что дублирование одного и того же файла сборки (я осмелюсь сказать) неприемлемо, из-за того, что я могу захотеть что-то изменить во всей логике сборки всех модулей
какой был бы лучший подход для обработки такого рода настроек?
2 ответов
большинство из этого довольно нормально для http://www.gradle.org/docs/current/userguide/multi_project_builds.html Страница. Однако вам нужно будет добавить
evaluationDependsOn(':project1')
evaluationDependsOn(':project2')
так что gradle будет оценивать project1 и project2 перед модулем. Во всех проектах, содержащих код, вам нужно будет иметь пустую сборку.файл gradle. Это также позволит вам настроить проект, если это необходимо.
пример: https://github.com/ethankhall/AndroidComplexBuild
добавить сборку.gradle в корне ваших проектов. Поэтому вам нужно 4, которые имеют полезную информацию в нем.
/build.gradle
/settings.gradle
/project1/build.gradle
/project2/build.gradle
/module/build.gradle
in / build.gradle put
dependencies {
project(":module")
}
в /настройки.gradle put
include ':module'
include ':project1', ':project1:A1', ':project1:B1', ':project1:Z1'
include ':project2', ':project2:A2', ':project2:B2', ':project2:Z2'
in / project1 / build.gradle put
apply plugin: 'java'
subprojects {
apply plugin: 'java'
sourceCompatibility = JavaVersion.VERSION_1_6
targetCompatibility = JavaVersion.VERSION_1_6
repositories{
mavenCentral()
}
//Anything else you would need here that would be shared across all subprojects
}
/ project2 / build.Gradle в
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:0.4.2'
}
}
subprojects {
apply plugin: 'android-library'
android {
compileSdkVersion 17
buildToolsVersion "17.0"
}
sourceCompatibility = JavaVersion.VERSION_1_6
targetCompatibility = JavaVersion.VERSION_1_6
repositories{
mavenCentral()
}
//Anything else you would need here that would be shared across all subprojects
}
in / module / build.gradle put
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:0.4.2'
}
}
evaluationDependsOn(':project1')
evaluationDependsOn(':project2')
apply plugin: 'android'
android {
compileSdkVersion 17
buildToolsVersion "17.0"
}
dependencies {
compile project(":project1:A1")
compile project(":project1:B1")
compile project(":project1:Z1")
compile project(":project2:A2")
compile project(":project2:B2")
compile project(":project2:Z2")
}
Если у вас есть папки, соответствующие этой структуре, вы можете применить одну и ту же логику сборки к нескольким проектам.
Если настройки.Gradle в содержит
include ':project2:moduleA2'
тогда': project2 ' также является проектом, и он может иметь свою собственную сборку.gradle, в котором вы можете написать:
subprojects { project ->
apply plugin 'android-library'
// more configuration
}
Если вы не применяете какой-либо плагин к самому": project2", то этот проект просто ничего не выведет (что, вероятно, то, что вы хотите), но таким образом вы можете настроить все его подпроект в простой ход.
тогда вы также можете иметь все ваши подмодули поставить некоторую логику, которая специфична для них
вы также можете технически сделать это в project2 / build.gradle, если вы хотите сохранить все это в одном файле. Вы можете читать http://www.gradle.org/docs/current/userguide/multi_project_builds.html чтобы узнать, как настроить подпроекты из родительской сборки.gradle файл, доступ ко всем подпроектам или к конкретному, или с помощью фильтрации.