我正在尝试了解如何处理以下项目设置:
┌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
在当前设置中,我在每个模块中都有一个build.gradle,我真正讨厌这个设置的是build.gradle的所有内容在模块之间重复。
事实是,我希望大多数人都有相同的逻辑,'纯Java模块'都是infra模块,我想要输出输出,JavaDoc和源代码,以及部署到某个远程存储库(* default)。
另一方面,'纯Java模块'的一些模块我想有第二个议程,例如,除了默认的* build之外,我想部署一个jar特定项目的依赖关系,或类似的东西。
在构建 Actual Android Project 时,我希望模块能够在默认的* build中进行编译,最后为我的所有Android项目配置一个默认的build.gradle。很少,我不想复制该文件。
============================================ ===================
我想我正在寻找的是像Maven父母那样的东西,但由于我不完全理解Gradle是如何工作的,所以我打开这个给你们分享你的想法...
考虑到重复相同的构建文件(我敢说)是不可接受的,因为我可能想要在所有模块的所有构建逻辑中更改某些内容
处理这种设置的最佳方法是什么?
答案 0 :(得分:57)
大部分内容与http://www.gradle.org/docs/current/userguide/multi_project_builds.html页面相当正常。但是,您需要添加
evaluationDependsOn(':project1')
evaluationDependsOn(':project2')
这样gradle将在模块之前评估project1和project2。在包含代码的所有项目中,您将需要一个空的build.gradle文件。这还允许您根据需要自定义项目。
示例: https://github.com/ethankhall/AndroidComplexBuild
在项目的根目录中添加build.gradle。所以你需要有4个有用的信息。
/build.gradle
/settings.gradle
/project1/build.gradle
/project2/build.gradle
/module/build.gradle
在/build.gradle中
dependencies {
project(":module")
}
在/settings.gradle put
include ':module'
include ':project1', ':project1:A1', ':project1:B1', ':project1:Z1'
include ':project2', ':project2:A2', ':project2:B2', ':project2:Z2'
在/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
}
在/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")
}
答案 1 :(得分:8)
如果您有与该结构匹配的文件夹,则可以将相同的构建逻辑应用于多个项目。
如果您的settings.gradle包含
include ':project2:moduleA2'
然后':project2'也是一个项目,它可以有自己的build.gradle,你可以在其中写:
subprojects { project ->
apply plugin 'android-library'
// more configuration
}
如果你没有将任何插件应用于':project2'本身,那么这个项目根本不会输出任何东西(这可能是你想要的),但这样你就可以简单地配置它的所有子项目了。
然后你也可以让你的所有子模块都有一些特定于他们的逻辑
如果要将它们全部保存在同一个文件中,您还可以在project2 / build.gradle中进行技术操作。您可以阅读http://www.gradle.org/docs/current/userguide/multi_project_builds.html以了解如何从父build.gradle文件配置子项目,访问所有子项目或特定子项目,或使用过滤。