有多少gradle文件可以相互继承?怎么"深"子项目可以吗?

时间:2018-01-04 00:36:17

标签: gradle

我有一个具有以下结构的项目:

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 
                                                                 }

1 个答案:

答案 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: ...
}