我有一个具有以下结构的项目:
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
}
答案 0 :(得分:2)
除了根项目和所有其他模块之外,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: ...
}