Gradle 的演变 - 与 Adam Murdoch 的对话
我们与 Gradle 的 CTO Adam Murdoch 进行了一次 对话,谈论了他从 Gradle 的起源开始的旅程。Adam 分享了对最新功能的见解,并讨论了构建工具的未来。
Gradle 的起源
Adam 在 2008 年左右开始了他的 Gradle 之旅,当时他正在寻找一种强大的替代方案来替代他当时使用的基于 Ant 的构建系统。他回忆说:“我当时正在寻找我们基于 Ant 的构建系统的替代方案,偶然发现了这个名为 Gradle 的新工具,开始使用它,[并且] 开始发送补丁以进行改进。”
Gradle 的创始人 Hans Dockter 认可了 Adam 的贡献,并邀请他加入成为维护者。这种合作标志着构建自动化转型之旅的开始。“15 年后的今天,”Adam 回顾道,反思了自那些早期以来发生的巨大变化。
认识不断发展的生态系统
回顾多年来构建工具的演变,Adam 指出生态系统的急剧扩张。“当我们开始 Gradle 时,还没有微服务……构建软件意味着编译一些类,进行调整,然后就完成了。”
如今,情况大不相同。构建工具现在需要处理从部署到生产的各种任务,这些任务在 Gradle 最初开始时并未考虑在内。Kotlin 等语言和 Android 等平台的引入进一步扩展了 Gradle 在开发者社区中的作用。
- 2012:Gradle 构建工具 1.0 引入了一个更快、更准确的依赖项解析引擎,并扩展了插件支持。
- 2014:Gradle 构建工具 2.0 提高了性能和内存效率,引入了新的依赖项管理功能,并增强了增量构建支持。
- 2016:Gradle 构建工具 3.0 默认启用 Gradle Daemon,并通过 Kotlin DSL 的自动完成和导航增强了 IDE 支持。
- 2016:Gradle, Inc. 发布了 Gradle Enterprise 作为商业产品,以使用 Build Scan® 和 Build Cache 更快更好地构建软件。
- 2017:Gradle 构建工具 4.0 使构建缓存对 Java 和 Groovy 编译做好生产准备,添加了丰富的控制台输出,并改进了增量编译。
- 2018:Gradle 构建工具 5.0 将 Kotlin DSL 用于构建脚本提升到生产就绪状态,支持 Java 11,添加了依赖项管理版本对齐,并通过注释处理改进了增量编译。
支持更大的项目
Adam 指出,构建工具的范围已经扩大,软件项目的规模呈指数级增长。“每个团队都在生产越来越多的软件,而且每年都在增加,”他说,强调了在不断增长的需求下提高性能的持续挑战。这种可扩展性至关重要,Adam 提及 Gradle 一直专注于通过解决配置模型中的基本限制来克服历史上的扩展问题。
- 2019:Gradle 构建工具 6.0 引入了增强的依赖项管理,采用新的元数据格式,并通过更新的生态系统插件和 API 提高了开发人员的生产力。
- 2021:Gradle 构建工具 7.0 提供了更快的增量构建,通过依赖项完整性验证增强了安全性,并支持 Java 16。
- 2023:Gradle 构建工具 8.0 首次推出了配置缓存,增强了并行性以实现更快的构建,并改进了 Java 编译。
- 2023:Gradle, Inc. 将 Gradle Enterprise 重命名,以强调其对构建工具的通用方法。Develocity 当然支持 Gradle,但也支持 Bazel、SBT 和 Maven。它还引入了两个主要功能,测试分发 和 预测性测试选择,使用 ML(机器学习)。
专注于开发人员的生产力
在过去的五年中,Gradle 构建工具和 Develocity 工程师一直高度关注提高开发人员的生产力,方法是:
- 强调快速反馈循环和早期错误检测的重要性。
- 量化与低生产力环境相关的成本。
- 通过利用缓存等加速技术来改进开发流程。
- 利用数据主动提高开发工具链的可靠性。
- 识别并消除频繁错误和诸如不稳定测试之类的噪声信号。
无论是使用 Gradle 构建工具还是 Develocity,从构建中获得深刻见解都是“提高生产力的重要工具”。Adam 说:“一旦你知道了问题,就很容易解决。”
下一步是什么?
Adam 目前的重点是声明式 Gradle 和隔离项目,以提高 Gradle 的可用性。“从历史上看,Gradle 的受众是构建工程师,[...] 我们正在将这种关注点转移到软件开发人员身上。”
隔离项目
Adam 强调隔离项目是 Gradle 中的一项改变游戏规则的功能。此开发专注于增强性能并显着减少构建期间的内存占用,为管理单一存储库或大型项目的开发人员带来了巨大的好处。
启用隔离项目后,Gradle 项目的配置模型将彼此“隔离”。这意味着构建逻辑(如应用于项目的构建脚本或插件)无法直接访问另一个项目的可变状态。这种隔离允许为每个项目安全地并行运行配置和工具模型创建,结果将被缓存并独立地对每个项目进行失效。
查看 隔离项目文档页面 以了解更多信息。
声明式 Gradle
Adam 还提到了一个名为声明式 Gradle 的项目,该项目旨在使 Gradle 对软件开发人员更加友好。其理念是,软件开发人员应该能够升级依赖项、将 Kotlin 支持添加到他们的项目中或添加功能测试,而无需深入了解 Gradle。使用声明式 Gradle,开发人员还将受益于更好的工具,主要是在 IDE 中,通过自动更改软件定义。
使用声明式 Gradle,构建定义以高级的、描述性的方式表达,而不是通过命令式代码和构建逻辑。软件开发人员使用声明式 DSL 表达的软件类型进行交互,以描述需要构建的内容,包括语言、目标平台、依赖项和软件的质量检查,而无需深入了解如何构建该软件。
androidLibrary {
namespace = "com.google.samples.apps.nowinandroid.core.common"
dependencies {
implementation("org.jetbrains.kotlinx:kotlinx-coroutines:1.7.3")
implementation("app.cash.turbine:turbine:1.0.0")
}
buildTypes {
debug {}
release {}
}
}
使用声明式 DSL 不可能实现像控制流这样的编程结构。这清楚地将软件定义与构建逻辑分离,并允许开发人员专注于使用熟悉的术语描述他们的软件,而构建工程师则在插件中处理底层实现细节。这种方法确保了更简洁、更直观和更易于维护的构建过程。
了解更多关于声明式 Gradle
声明式 Gradle 是一个正在积极开发的实验项目。目前,不保证兼容性,并且它尚未准备好用于实际应用。对 DSL 语法或可用功能没有承诺。我们预计在 2024 年年中发布第一个早期访问预览 (EAP),以收集有关项目方向的反馈。
- 前往声明式 Gradle 网站探索原型和早期入门指南,包括Now in Android 项目。
- 观看 Sterling Greene 和 Paul Merlin 在 2024 年 5 月 24 日的 KotlinConf 上发表的以开发者为中心的 Gradle 构建演示。
- 阅读最初的声明式 Gradle 公告和宣言。
至于 Adam,他说:“对于隔离项目和声明式 Gradle 的成功,我们必须获得人们的反馈。” 我们感谢您通过 GitHub 问题或通过Gradle 社区 Slack上的#releases-discussion
和#declarative-gradle
频道提供的任何反馈。