Gradle和Multi-Project结构

我想了解我应该如何处理以下项目设置:

┌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模块,我希望Jar输出,JavaDoc和源,并部署到一些远程存储库(*默认)。

另一方面,“ 纯Java模块 ”的一些模块,我想有第二个议程,例如,除了默认*构build我想部署一个具有依赖项的jar或类似的东西。

在构build实际的Android项目时 ,我希望模块在默认的* build中编译,最后为我所有的Android项目configuration一个默认的build.gradle,这是很多的,我不想重复文件。

================================================== =============

我想我正在寻找的是像Maven父POM,但因为我不完全了解Gradle如何工作,我打开这个给你们分享你的想法…

考虑到复制相同的构build文件是(我敢说)是不可接受的,因为我可能想改变所有模块的所有构build逻辑

什么是处理这种设置的最佳方法?

大部分情况与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放

 include ':module' include ':project1', ':project1:A1', ':project1:B1', ':project1:Z1' include ':project2', ':project2:A2', ':project2:B2', ':project2:Z2' 

在/project1/build.gradle放

 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放

 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") } 

如果您有与该结构匹配的文件夹,则可以将相同的构build逻辑应用于多个项目。

如果你的settings.gradle包含

 include ':project2:moduleA2' 

那么':project2'也是一个项目,它可以有自己的build.gradle,你可以在其中编写:

 subprojects { project -> apply plugin 'android-library' // more configuration } 

如果您没有将任何插件应用于“:project2”本身,那么这个项目将不会输出任何东西(这可能是您想要的),但是这样您就可以简单地configuration其所有的子项目。

那么你也可以让你所有的子模块都有一些特定的逻辑

你也可以在project2 / build.gradle中做到这一点,如果你想保持在同一个文件中。 您可以阅读http://www.gradle.org/docs/current/userguide/multi_project_builds.html ,了解如何从父级build.gradle文件configuration子项目,访问所有子项目或特定的子项目,或使用筛选。

Interesting Posts