我有一个具有以下结构的项目:
Root project 'ExampleProject'
+--- Project ':client'
| +--- Project ':client:android'
| +--- Project ':client:core'
| +--- Project ':client:desktop'
| +--- Project ':client:html'
| \--- Project ':client:ios'
+--- Project ':common'
+--- Project ':editor'
\--- Project ':server'
有一个settings.gradle如下:
include ":client", ":common", ":editor", ":server",
"client:desktop", ':client:android', ':client:ios',
':client:html', ':client:core'
rootProject.name = "ExampleProject"
每个级别都有build.gradle文件。项目根目录中有一个,客户端根目录,客户端一个:android root等。
似乎客户端:android不是从build.gradle为:client项目继承插件等。是否有最多(2?)的build.gradle文件可以“链接”并继承多少?
客户端build.gradle有一个这样的块,没有被继承:
project(":client:android") { //plugins and dependencies here
}
除了根项目和所有其他模块之外,gradle中没有特殊的父子关系。意思是子项目的核心概念也不是它自己子项目的“父”。在这方面,文件似乎有点误导。它说:“项目中声明的属性和方法将继承到其所有子项目。”但我认为这实际上只涉及根build.gradle和所有其他,它不是递归的。也许那已经回答了你的问题。
通常也不希望有任何这样的概念,因为gradle试图通过模块化和增量来尽可能快。所以build.gradle
文件应该是自给自足的,不需要任何父项运行(除了root build.gradle)。这是与Maven的根本区别,Maven严重依赖继承来避免重复XML代码。
因此,虽然您可以编写自定义gradle代码来实现这种继承,但您可能不应该这样做。而不是共享gradle代码,你应该更喜欢组合(apply from
),在buildSrc
文件夹中添加自定义代码/自定义插件,或者在根build.gradle
文件中定义子模块组。
那么几个gradle项目会做的是在根build.gradle
文件中定义所有子项目组及其配置,如下所示:
def clientProjects() {
return subprojects.findAll {
// some predicate that is true only for client projects
}
}
configure(clientProjects()) {
apply plugin: ...
}