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

A

工件 (Artifact)

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

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

B

构建 (Build)

构建是 Gradle 执行的原子工作的总和。它由项目组成,这些项目又包含一系列任务

构建通常具有成功 (SUCCESS) 或失败 (FAILURE) 的结果。

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

构建扫描

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

构建脚本 (Build Script)

build.gradle 脚本。

构建脚本的存在,以及设置脚本中的条目(根构建脚本除外,它不需要条目),定义了 Gradle 模块

C

能力 (Capability)

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

组件 (Component)

模块的任何单个版本。

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

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

组件元数据规则 (Component Metadata Rule)

组件元数据规则是一种规则,用于在从仓库获取组件元数据后对其进行修改,例如添加缺失信息或纠正错误信息。与解析规则不同,组件元数据规则在解析开始**之前**应用。组件元数据规则作为构建逻辑的一部分定义,并可以通过插件共享。有关更多信息,请参阅有关使用组件元数据规则修复元数据的章节。

配置

配置 (Configuration) 是一组命名的依赖项,为了特定目标而分组在一起。配置提供对底层已解析的模块及其工件的访问。有关更多信息,请参阅有关依赖项配置以及可解析和可消费配置的章节。

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

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

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

约定插件 (Convention Plugin)

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

跨配置 (Cross-Configuration)

参见跨项目配置

跨项目配置 (Cross-Project Configuration)

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

它允许您在共享的 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}")
    }
}

这使得 subprojectAsubprojectB 紧密耦合,破坏了模块化并在并行构建或配置缓存期间产生潜在问题。

D

依赖项 (Dependency)

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

依赖约束 (Dependency Constraint)

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

E

急切 (Eager)

许多 Gradle API 有两种形式:eagerlazy。区别在于何时计算或解析值。

急切意味着立即。值在配置阶段立即评估。这可能导致不必要的工作,尤其是在大型构建中。它更容易出现性能问题。

build.gradle.kts
// Eager: evaluated as soon as the build script runs
val myValue = file("output.txt")
// Lazy: evaluated only when required
val myValue = layout.buildDirectory.file("output.txt")
生态系统插件 (Ecosystem Plugin)

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

执行阶段 (Execution phase)

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

此阶段具有多级并行性。

F

特性变体 (Feature Variant)

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

G

Gradle 构建 (Gradle Build)

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

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

H

I

增量构建 (Incremental Builds)

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

初始化脚本 (Init Script)

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

J

K

L

惰性 (Lazy)

许多 Gradle API 有两种形式:eager (急切)lazy (惰性)。区别在于何时计算或解析值。

惰性意味着延迟。值会被延迟计算,直到它们真正需要时(通常在执行阶段)才进行。这更高效,并支持配置缓存和最新检查等功能。

build.gradle.kts
// Lazy: evaluated only when required
val myValue = layout.buildDirectory.file("output.txt")
// Eager: evaluated as soon as the build script runs
val myValue = file("output.txt")

M

MavenCentral

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

还存在许多其他仓库,例如(现已停用的)jcenterGoogle Maven 仓库

模块 (Module)

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

模块元数据 (Module Metadata)

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

模块版本 (Module version)

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

N

O

P

平台 (Platform)

平台是一组旨在协同使用的模块。存在对应于不同用例的不同类别的平台:

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

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

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

    此外,Gradle 定义了虚拟平台

    Maven 的 BOM (bill-of-material) 是一种流行的平台,Gradle 支持
插件

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

根据应用上下文,插件有三种*类型*:

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

  2. 实现 Plugin<Settings> 的设置插件,应用于设置脚本中。

  3. 实现 Plugin<Gradle> 的 Init (Gradle) 插件,应用于初始化脚本中。

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

预编译脚本插件 (Precompiled Script Plugin)

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

项目 (Project)

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

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

发布 (Publication)

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

发布具有名称,并包含一个或多个工件以及有关这些工件的信息(元数据)。

Q

R

仓库 (Repository)

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

解析规则 (Resolution rule)

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

S

脚本插件 (Script Plugin)

一个 Gradle 脚本,可以应用于其他 Gradle 脚本,包括构建脚本设置脚本初始化脚本。它可以用 Groovy 或 Kotlin 编写,并通过 apply 方法应用于其他脚本。根据它们所应用的脚本类型,它们由Project实例、Settings实例或Gradle实例支持。

设置脚本 (Settings Script)

一个 settings.gradle(.kts) 脚本。设置脚本负有大量职责,但其中最重要的是通过 include :project 声明构成构建的项目集。

T

任务 (Task)

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

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

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

传递依赖项 (Transitive dependency)

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

U

V

(组件的)变体 (Variant (of a component))

每个组件由一个或多个变体组成。一个变体由一组工件组成,并定义了一组依赖项。它通过一组属性能力来标识。

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

变体属性 (Variant Attribute)

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

W

X

Y

Z