以下词汇表帮助您理解 Gradle 术语。

A

产物

构建生成的 文件或目录,例如 JAR 文件、ZIP 发行包或原生可执行文件。

产物通常设计为供用户和其他项目使用或消费,或部署到托管系统。在这些情况下,产物是单个文件。目录在项目间依赖的情况下很常见,以避免生成可发布产物的成本。

B

构建

构建是 Gradle 执行的原子工作单元的集合。它由项目组成,这些项目拥有一系列任务

构建通常具有 SUCCESS 或 FAILURE 的结果。

您可以使用 gradlegradlew 命令运行构建。

Build Scan

Build Scan 是 Gradle 提供的一项服务,用于识别构建问题和构建性能。

构建脚本

build.gradle 脚本。

构建脚本的存在,以及在settings 脚本中的条目(根构建脚本除外,它不需要条目),是定义 Gradle 模块的要素。

C

能力

能力标识由一个或多个组件提供的特性。能力由类似于用于模块版本的坐标标识。默认情况下,每个模块版本都提供与其坐标匹配的能力,例如 com.google:guava:18.0。能力可用于表达组件提供多个特性变体,或者两个不同的组件实现相同的功能(因此不能一起使用)。有关更多详细信息,请参阅关于能力的部分。

组件

模块的任何单个版本。

对于外部库,术语组件指的是一个已发布的库版本。

在构建中,组件由插件(例如,Java Library 插件)定义,并提供一种简单的方式来定义发布的发布物。它们包含产物以及描述组件变体详细信息的适当元数据。例如,默认设置中的 java 组件由 JAR 文件(由 jar 任务生成)和 Java apiruntime 变体的依赖信息组成。它还可以定义其他变体,例如 sourcesJavadoc,以及相应的产物。

组件元数据规则

组件元数据规则是在从仓库获取组件元数据后修改组件元数据的规则,例如,添加缺失的信息或更正不正确的信息。与解析规则相反,组件元数据规则在解析开始之前应用。组件元数据规则被定义为构建逻辑的一部分,可以通过插件共享。有关更多信息,请参阅关于使用组件元数据规则修复元数据的部分。

配置

配置是为特定目标分组在一起的依赖的命名集合。配置提供对底层已解析的模块及其产物的访问。有关更多信息,请参阅关于依赖配置以及可解析和可消费配置的部分。

“配置”一词是一个重载术语,在依赖管理之外具有不同的含义。
配置阶段

Gradle 构建由两个主要阶段组成:配置阶段(不要与[sub:terminology_configuration] 实例混淆)和执行阶段

配置阶段首先发生,并且是单线程的。

约定插件

构建在生态系统插件之上的[sub:terminology_plugin],它将常见的约定应用于使用该插件的构建脚本。

跨配置

请参阅跨项目配置

跨项目配置

跨项目配置是指在多项目构建中管理和自定义多个子项目。

它允许您在共享的 build.gradle(.kts)settings.gradle.(kts) 文件中定义通用设置、依赖项和任务,通常位于根项目中

build.gradle
subprojects {
    apply plugin: 'java'
    repositories {
        mavenCentral()
    }
    dependencies {
        testImplementation 'junit:junit:4.13.2'
    }
}

跨项目配置通常会破坏项目隔离和并行项目执行,因此您应尽可能使用约定插件或适当的 API

build.gradle
gradle.lifecycle.beforeProject {
    repositories {
        mavenCentral()
    }
}

始终避免以下跨项目配置示例

subprojectA/build.gradle
tasks.register("customTask") {
    // Avoid this! Directly accessing outputs from another subproject's task
    def outputFile = project(":subprojectB").tasks.named("someTask").get().outputs.files.singleFile
    inputs.file(outputFile)
    doLast {
        println("Processing file from subprojectB: ${outputFile}")
    }
}
subprojectB/build.gradle
tasks.register("someTask") {
    def outputFile = layout.buildDirectory.file("output.txt")
    outputs.file(outputFile)
    doLast {
        outputFile.get().asFile.text = "Output from subprojectB"
        println("Generated output file in subprojectB: ${outputFile.get().asFile}")
    }
}

这会将 subprojectA 紧密耦合到 subprojectB,破坏模块化并在并行构建或配置缓存期间创建潜在问题。

D

依赖

依赖是指向构建、测试或运行模块所需的另一段软件的指针。有关更多信息,请参阅关于声明依赖的部分。

依赖约束

依赖约束定义了模块需要满足的要求,以使其成为依赖的有效解析结果。例如,依赖约束可以缩小支持的模块版本集。依赖约束可用于表达传递依赖的此类要求。有关更多信息,请参阅关于升级和降级传递依赖的部分。

E

生态系统插件

负责构建语言的[sub:terminology_plugin],例如 Java (javajava-library)、Groovy、Scala、Android、Kotlin 等。许多插件由 Gradle 维护,并且是 Gradle 发行版的一部分。

执行阶段

Gradle 构建的第二个主要阶段,执行阶段在配置阶段完成后发生。这是执行所有任务操作的地方。

此阶段具有多个并行级别。

F

特性变体

特性变体是表示组件特性的变体,可以单独选择或不选择。特性变体由一个或多个能力标识。有关更多信息,请参阅关于建模特性变体和可选依赖的部分。

G

Gradle 构建

Gradle 构建可以由一个或多个 Gradle 项目组成,并且通常使用根目录下的 settings.gradle(.kts) 文件进行配置。

调用时,Gradle 构建会根据定义的构建逻辑执行一组任务,通常使用 Gradle Wrapper (./gradlew)。

H

I

增量构建

增量构建仅执行必要的任务。如果我们运行任何源代码,Gradle 首先检查该源代码是否经历过任何先前的执行。如果代码有一些更改,则将执行该代码,但如果没有更改,则将跳过该代码的执行。

初始化脚本

初始化脚本或 init 脚本由 Gradle 类型的实例支持。

J

K

L

M

MavenCentral

MavenCentral 是托管 Maven 发布的主要仓库。它由一家名为 Sonatype 的公司运营,并且是许多生态系统的默认仓库。

存在许多其他仓库,例如(现在已 defunct)jcenterGoogle Maven 仓库

模块

随着时间推移演变的软件片段,例如 Google Guava。每个模块都有一个名称。每个模块版本都由模块版本最佳表示。为了方便消费,模块可以托管在仓库中。

模块元数据

模块的发布提供元数据。元数据是更详细地描述模块的数据,例如,关于产物位置或所需传递依赖的信息。Gradle 提供其自己的元数据格式,称为 Gradle 模块元数据 (.module 文件),但也支持 Maven (.pom) 和 Ivy (ivy.xml) 元数据。请参阅关于理解 Gradle 模块元数据的部分,以获取有关支持的元数据格式的更多信息。

模块版本

模块版本表示已发布的模块的不同更改集。例如,18.0 表示坐标为 com.google:guava:18.0 的模块版本。实际上,模块版本的方案没有限制。时间戳、数字和特殊后缀(如 -GA)都是允许的标识符。最广泛使用的版本控制策略是 语义版本控制

N

O

P

平台

平台是一组旨在一起使用的模块。平台有不同的类别,对应于不同的用例

  • 模块集:通常是一组作为一个整体发布的模块。使用该集合的一个模块通常意味着我们希望对集合的所有模块使用相同的版本。例如,如果使用 groovy 1.2,也使用 groovy-json 1.2。

  • 运行时环境:一组已知可以很好地协同工作的库,例如 Spring Platform,它为 Spring 和与 Spring 良好协作的组件推荐版本。

  • 部署环境:Java 运行时,应用服务器等……

    此外,Gradle 定义了虚拟平台

    Maven 的 BOM(物料清单)是一个流行的平台,Gradle 支持它。
插件

Gradle 构建在插件系统之上。Gradle 本身主要由基础设施组成,例如,对于所有项目类型都复杂的依赖解析引擎。其余功能来自插件,包括与 Gradle 本身一起分发的“核心”插件、第三方插件以及给定构建中的脚本插件

基于应用它们的上下文,插件有三种类型

  1. 项目插件,实现 Plugin<Project>,在构建脚本中应用。

  2. Settings 插件,实现 Plugin<Settings>,在settings 脚本中应用。

  3. Init (Gradle) 插件,实现 Plugin<Gradle>,在init 脚本中应用。

插件可以实现为所谓的二进制插件(即,通过显式实现上述特定泛型接口之一),或者作为预编译脚本插件。这种区别仅仅是一个实现细节。

预编译脚本插件

等效于插件,但编写方式使其看起来像构建脚本,预编译脚本插件可以使用 Groovy 或 Kotlin 编写,分别应用 groovy-gradle-pluginkotlin-dsl 插件。

项目

通常称为“模块”,每个 Gradle 项目都由 Project 实例支持,因此得名。

大多数 Gradle 构建由许多项目(通常称为“子项目”)组成。

发布物

应该作为单个实体发布到仓库供使用者使用的文件和元数据的描述。

发布物具有名称,并且由一个或多个产物加上关于这些产物的信息(元数据)组成。

Q

R

仓库

仓库托管一组模块,每个模块可以提供一个或多个由模块版本指示的发布(组件)。仓库可以基于二进制仓库产品(例如,Artifactory 或 Nexus)或文件系统中的目录结构。有关更多信息,请参阅声明仓库

解析规则

解析规则直接影响依赖的解析行为。解析规则被定义为构建逻辑的一部分。有关更多信息,请参阅关于直接自定义依赖解析的部分。

S

脚本插件

可以应用于其他 Gradle 脚本的 Gradle 脚本,包括构建脚本settings 脚本init 脚本。它可以使用 Groovy 或 Kotlin 编写,并通过 apply 方法应用于其他脚本。根据它们应用到的脚本类型,它们由Project 实例、Settings 实例或Gradle 实例支持。

Settings 脚本

settings.gradle(.kts) 脚本。Settings 脚本具有大量职责,但最重要的职责之一是通过 include :project 声明作为构建一部分的项目集。

T

任务

每个项目由一个或多个任务组成。每个任务都应该是原子的(但通常不是),具有输入和输出。Gradle 执行任务以执行其工作。

任务示例包括:编译源代码、创建产物(例如 jar 或 apk)、生成 Javadoc、运行静态分析(例如 lint)、删除临时文件或发布到仓库等。

当要求 Gradle 任务运行时,我们可以看到任务的结果。这将是 EXECUTEDSKIPPEDFAILEDFROM-CACHEUP-TO-DATENO-SOURCE空白之一(表示已执行)。

传递依赖

组件的变体可能具有对其他模块的依赖才能正常工作,即所谓的传递依赖。托管在仓库上的模块发布可以提供元数据来声明这些传递依赖。默认情况下,Gradle 会自动解析传递依赖。传递依赖的版本选择可以通过声明依赖约束来影响。

U

V

变体(组件的)

每个组件由一个或多个变体组成。变体由一组产物组成,并定义一组依赖项。它由一组属性能力标识。

Gradle 的依赖解析是变体感知的,并在选择组件(即,模块的一个版本)后选择每个组件的一个或多个变体。如果变体选择结果不明确,也可能会失败,这意味着 Gradle 没有足够的信息来选择多个互斥的变体之一。在这种情况下,可以通过变体属性提供更多信息。每个 Java 组件通常提供的变体示例是 apiruntime 变体。其他示例是 JDK8 和 JDK11 变体。有关更多信息,请参阅关于变体选择的部分。

变体属性

属性用于标识和选择变体。变体定义了一个或多个属性,例如 org.gradle.usage=java-apiorg.gradle.jvm.version=11。当解析依赖项时,会请求一组属性,Gradle 会为依赖图中的每个组件找到最合适的变体。可以为属性实现兼容性和消除歧义规则,以表达值之间的兼容性(例如,Java 8 与 Java 11 兼容,但如果请求的版本为 11 或更高版本,则应首选 Java 11)。此类规则通常由插件提供。有关更多信息,请参阅关于变体选择声明属性的部分。

W

X

Y

Z