设置文件是每个 Gradle 构建的入口点。

作者 等级 7

在 Gradle Build 生命周期的早期,初始化阶段会在项目根目录中查找设置文件。

找到设置文件后settings.gradle(.kts),Gradle 会实例化一个Settings对象。

该对象的用途之一Settings是允许您声明要包含在构建中的所有项目。

设置脚本

设置脚本可以是settings.gradleGroovy 中的文件,也可以是settings.gradle.ktsKotlin 中的文件。

在 Gradle 组装项目进行构建之前,它会创建一个Settings实例并针对它执行设置文件。

设置

当设置脚本执行时,它会配置此Settings.因此,设置文件定义了该Settings对象。

Settings实例和文件 之间存在一一对应的关系settings.gradle(.kts)

物体Settings

该对象是Gradle APISettings的一部分。

  • 在 Groovy DSL 中,可以在此处Settings找到对象文档。

  • 在 Kotlin DSL 中,可以在此处Settings找到对象文档。

设置脚本中的许多顶级属性和块都是设置 API 的一部分。

例如,我们可以使用以下属性在设置脚本中设置根项目名称Settings.rootProject

settings.rootProject.name = "root"

通常缩写为:

rootProject.name = "root"

标准Settings特性

Settings对象在您的设置脚本中公开一组标准属性。

下表列出了一些常用的属性:

姓名 描述

buildCache

构建缓存配置。

plugins

已应用于设置的插件的容器。

rootDir

构建的根目录。根目录是根项目的项目目录。

rootProject

构建的根项目。

settings

返回此设置对象。

下表列出了几种常用的方法:

姓名 描述

include()

将给定的项目添加到构建中。

includeBuild()

包括复合构建的指定路径处的构建。

设置脚本结构

设置脚本是对 Gradle API 的一系列方法调用,通常使用{ …​ },这是 Groovy 和 Kotlin 语言中的特殊快捷方式。块在 Kotlin 中{ }称为lambda ,在 Groovy 中称为闭包。

简而言之,该plugins{ }块是一个方法调用,其中传递 Kotlin lambda对象或 Groovy闭包对象作为参数。它的缩写形式是:

plugins(function() {
    id("plugin")
})

块映射到 Gradle API 方法。

函数内的代码针对一个对象执行,该对象在 Kotlin lambda 中this称为接收器,在 Groovy 闭包中称为委托。 Gradle 确定正确的this对象并调用正确的相应方法。this方法调用对象的 的类型id("plugin")PluginDependenciesSpec

设置文件由构建在 DSL 之上的 Gradle API 调用组成。 Gradle 从上到下逐行执行脚本。

让我们看一个例子并将其分解:

settings.gradle.kts
pluginManagement {                                          (1)
    repositories {
        gradlePluginPortal()
        google()
    }
}

plugins {                                                   (2)
    id("org.gradle.toolchains.fake") version "0.6.0"
}

rootProject.name = "root-project"                           (3)

dependencyResolutionManagement {                            (4)
    repositories {
        mavenCentral()
    }
}

include("sub-project-a")                                    (5)
include("sub-project-b")
include("sub-project-c")
1 Define the location of plugins
2 Apply plugins.
3 Define the root project name.
4 Define build-wide repositories.
5 Add subprojects to the build.
settings.gradle
pluginManagement {                                          (1)
    repositories {
        gradlePluginPortal()
        google()
    }
}

plugins {                                                   (2)
    id 'org.gradle.toolchains.fake' version '0.6.0'
}

rootProject.name = 'root-project'                           (3)

dependencyResolutionManagement {                            (4)
    repositories {
        mavenCentral()
    }
}

include('sub-project-a')                                    (5)
include('sub-project-b')
include('sub-project-c')
1 Define the location of plugins.
2 Apply plugins.
3 Define the root project name.
4 Define build-wide repositories.
5 Add subprojects to the build.

1.定义插件的位置

设置文件可以选择定义您的项目使用的插件pluginManagement,包括二进制存储库,例如 Gradle 插件门户或其他使用以下 Gradle 构建includeBuild

pluginManagement {
    repositories {
        gradlePluginPortal()
        google()
    }
}

您还可以在此块中包含插件和插件依赖项解析策略。

2. 应用插件

设置文件可以选择声明稍后可能应用的插件,这可以在多个构建/子项目之间添加共享配置:

应用于设置的插件仅影响Settings对象。

plugins {
    id("org.gradle.toolchains.fake") version "0.6.0"
}

这通常用于确保所有子项目使用相同的插件版本。

3.定义根项目名称

设置文件使用以下rootProject.name属性定义您的项目名称:

rootProject.name = "root-project"

每个构建只有一个根项目。

4. 定义构建范围的存储库

设置文件可以选择使用 Maven Central 等二进制存储库和/或其他 Gradle 构建来定义项目所依赖的组件的位置(以及如何解析它们):repositoriesincludeBuild

dependencyResolutionManagement {
    repositories {
        mavenCentral()
    }
}

您还可以在此部分中包含版本目录。

5. 将子项目添加到构建中

设置文件通过使用以下语句添加所有子项目来定义项目的结构include

include("app")
include("business-logic")
include("data-model")

设置文件脚本

该对象还有更多属性和方法Settings可用于配置构建。

重要的是要记住,虽然许多 Gradle 脚本通常是用简短的 Groovy 或 Kotlin 语法编写的,但设置脚本中的每个项目本质上都是调用SettingsGradle API 中对象的方法:

include("app")

实际上是:

settings.include("app")

此外,您还可以使用 Groovy 和 Kotlin 语言的全部功能。

例如,include您可以迭代项目根文件夹中的目录列表并自动包含它们,而不是多次添加子项目:

rootDir.listFiles().filter { it.isDirectory && (new File(it, "build.gradle.kts").exists()) }.forEach {
    include(it.name)
}
这种类型的逻辑应该在插件中开发。