Gradle 8.0 现已发布。Gradle 是一个基于 Apache Ant 和 Apache Maven 概念的项目自动化构建工具,支持依赖管理和多项目,类似 Maven,但比之简单轻便。它使用一种基于 Groovy 的特定领域语言来声明项目设置,而不是传统的 XML。
此版本包括对 Kotlin DSL 的一些改进;包括为声明式插件跳过 Kotlin 编译器的解释器,和升级到 Kotlin API level 1.8。以及有关 buildSrc 构建的一些改进,比如直接运行 buildSrc 任务、跳过测试、用 buildSrc 来 including 其他构建等。
还增强了配置缓存;包括通过从缓存条目加载任务并在第一次构建时隔离运行任务来实现更细粒度的并行性。此外,Gradle 8.0 还修复了一些错误,删除了弃用的功能,并进行了其他一般性改进。
Kotlin DSL
Gradle 的 Kotlin DSL 提供了传统 Groovy DSL 的替代语法,在支持的 IDE 中具有增强的编辑体验,具有卓越的内容帮助、重构、文档等功能。
改进的脚本编译性能
Gradle 8.0 为 .gradle.kts
脚本中的声明性插件 {} 块引入了一个解释器,使整体构建时间缩短了 20% 左右。默认情况下避免为声明性 plugins {}
块调用 Kotlin 编译器。
要利用此性能,用户需确保在声明性 plugins {}
块中使用受支持的格式,例如:
plugins {
id("java-library")// <1>
id("com.acme.example") version "1.0" apply false// <2>
kotlin("jvm") version "1.7.21"// <3>
}
- 插件标识符字符串的插件规范
- 带有版本和/或插件应用程序标志的插件规范
- Kotlin 插件规范助手
将 Kotlin DSL 更新为 Kotlin API level 1.8
以前,Kotlin DSL 使用 Kotlin API level 1.4。从 Gradle 8.0 开始,Kotlin DSL 使用 Kotlin API level 1.8。此更改带来了自 Kotlin 1.4.0 以来对 Kotlin 语言和标准库所做的所有改进。更多详细信息可访问 upgrading guide。
增强脚本编译以使用 Gradle JVM 作为 Kotlin JVM target
以前, .gradle.kts
脚本的编译始终使用 Java 8 作为 Kotlin JVM target。从 Gradle 8.0 开始,则使用运行构建的 JVM 版本。如果你的团队使用 Java 11 来运行 Gradle,这将允许你在构建脚本中使用 Java 11 库和语言功能。
值得注意的是,这不适用于预编译脚本插件。
预编译脚本插件现在使用配置的 Java 工具链
以前,预编译脚本插件的编译使用在 kotlinDslPluginOptions.jvmTarget
上配置的 JVM target。从 Gradle 8.0 开始,它现在使用配置的 Java 工具链,如果没有配置,则使用 Java 8。
更多详情可参阅 migration guide。
buildSrc
构建的改进
此版本包括对 buildSrc
构建的多项改进,使其表现得更像 included builds。Included builds 是另一种组织构建逻辑以分离项目配置的方法,以便更好地利用增量构建和任务缓存。
直接运行buildSrc
任务
现在可以从命令行运行 buildSrc
构建的任务,使用与 included builds 的任务相同的语法。例如,你可以使用 gradle buildSrc:build
在 buildSrc
构建中运行 build
任务。
有关详细信息,可参阅 user manual。
buildSrc
可以 includ 其他构建
buildSrc
构建现在可以通过在 buildSrc/settings.gradle.kts
或 buildSrc/settings.gradle
中声明来 include 其他构建。这允许用户在仍然使用buildSrc
的同时更好地组织其构建逻辑。
有关详细信息,可参阅 user manual。
buildSrc
的测试不再自动运行
当 Gradle 构建 buildSrc
的输出时,它只运行产生该输出的任务。它不再运行 build
任务。特别是,这意味着 buildSrc
及其子项目的测试在不需要时不会构建和执行。
你可以按照与其他项目相同的方式为buildSrc
运行测试,如上所述。
Init scripts 被应用于 buildSrc
除了 main build 和所有 included builds 之外,在命令行上使用--init-script
指定的 init scripts 现在会应用于 buildSrc
。
有关详细信息,可参阅 user manual。
Configuration cache 配置缓存
配置缓存通过缓存配置阶段的结果并将其重新用于后续构建来缩短构建时间。这是一个可以显着提高构建性能的孵化功能。
改进了首次运行时的并行配置缓存
配置缓存现在支持比使用并行执行更细粒度的并行性。从 Gradle 8.0 开始,使用配置缓存时任务从第一次构建开始并行运行。
Gradle 在重用配置缓存条目时始终并行运行任务。默认情况下,所有任务都并行运行,即使是同一项目中的任务,也要遵守依赖性约束。现在,它在存储缓存条目时也会这样做。
当启用配置缓存并且 Gradle 能够为当前构建找到兼容的缓存条目时,它将从缓存中加载任务并独立运行它们。如果 Gradle 找不到合适的缓存条目,它将运行配置阶段来确定必要的任务,将它们存储在新的缓存条目中,然后立即根据保存的状态运行构建。
有关详细信息,可参阅 user manual。
改进了与核心插件的兼容性
gradle init
命令可以与启用的配置缓存一起使用。
ANTLR 插件和 Groovy DSL 预编译脚本现在与配置缓存兼容。
所有核心 Gradle 插件的配置缓存支持的当前状态可以在配置缓存文档中找到。
Java 工具链改进
更新的工具链下载存储库
Gradle 7.6 引入了工具链存储库以提高灵活性。在 Gradle 8.0 中,不再有默认的 toolchain provisioner。用户必须明确声明至少一个 Java 工具链存储库。这可以通过工具链存储库插件来完成,例如 Foojay 工具链插件:
plugins {
id("org.gradle.toolchains.foojay-resolver-convention") version("0.4.0")
}
有关详细信息,可参阅 user manual。
一般性改进
改进了 Gradle 用户主页缓存清理
以前,Gradle 用户主目录中缓存的清理使用固定保留期(30 天或 7 天,具体取决于缓存)。这些保留期现在可以通过 Gradle 用户主页中的 init script 中的设置对象进行配置。
beforeSettings { settings ->
settings.caches {
downloadedResources.removeUnusedEntriesAfterDays = 45
}
}
此外,以前只能通过 Gradle 用户主页中的 org.gradle.cache.cleanup
Gradle 属性部分禁用缓存清理。禁用缓存清理现在会影响 Gradle 用户主目录下的更多缓存,也可以通过 Gradle 用户主目录中的 init script 中的设置对象进行配置。
有关详细信息,可参阅 user manual。
增强的警告模式all
和 fail
现在更加详细
在 Gradle 8.0 之前,应该 print 所有警告的警告模式只为每个特定的警告消息 print 一个。这导致了一些警告信息的丢失。例如,如果有两个具有相同信息的警告,但源自构建过程的不同步骤(即不同的堆栈跟踪),则只 print 一个。
现在会为消息和堆栈跟踪的每种组合都print 一个。这样的结果更加冗长,但也更加完整。
有关详细信息,可参阅 user manual。
此外,Gradle 8.0 还包括代码质量插件方面的一些改进、修复了 208 个 bug 等内容,更多详情可查看官方公告。