有多少gradle文件可以相互继承?子项目的“深度”程度如何?

问题描述 投票:0回答:1

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

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
1个回答
2
投票

除了根项目和所有其他模块之外,gradle中没有特殊的父子关系。意思是子项目的核心概念也不是它自己子项目的“父”。在这方面,文件似乎有点误导。它说:“项目中声明的属性和方法将继承到其所有子项目。”但我认为这实际上只涉及根build.gradle和所有其他,它不是递归的。也许那已经回答了你的问题。

Why inheritance is not desired

通常也不希望有任何这样的概念,因为gradle试图通过模块化和增量来尽可能快。所以build.gradle文件应该是自给自足的,不需要任何父项运行(除了root build.gradle)。这是与Maven的根本区别,Maven严重依赖继承来避免重复XML代码。

因此,虽然您可以编写自定义gradle代码来实现这种继承,但您可能不应该这样做。而不是共享gradle代码,你应该更喜欢组合(apply from),在buildSrc文件夹中添加自定义代码/自定义插件,或者在根build.gradle文件中定义子模块组。

Workaround for this kind of project setup

那么几个gradle项目会做的是在根build.gradle文件中定义所有子项目组及其配置,如下所示:

def clientProjects() {
    return subprojects.findAll {
            // some predicate that is true only for client projects
    }
}

configure(clientProjects()) {
    apply plugin: ...
}
© www.soinside.com 2019 - 2024. All rights reserved.