Gradle 9 之路,对话 Louis Jacomet

在 Devoxx France 大会上,我们与 Gradle 的技术主管 Louis Jacomet 讨论了即将发布的 Gradle 9 版本

目录

简介

在 Devoxx France 大会上,我们与 Gradle 公司的技术主管 Louis Jacomet 进行了交流。Louis 领导 Gradle 构建工具支持团队并协调版本发布,因此您经常可以在 GitHub 问题和 Gradle 会议上看到他活跃的身影。让我们深入了解 Louis 分享的关于即将发布的 Gradle 9 版本的信息!

alt_text

在 Devoxx FR 忙碌的一天 #

Louis 在 Devoxx FR 的星期五日程安排得很满,安排了 4 个小时的演讲。他与来自 Apache Maven 社区的 Hervé Boutemy 一起进行了一场关于驾驭依赖管理迷宫的会议,这是一个 1 小时的演讲。他还与他的同事 Paul Merlin 就 Gradle 9 中即将推出的功能进行了单独讨论。

一次准备这么多演讲并非易事。正如 Louis 所说:思考你想说什么,组织它,拥有酷炫的演示,并使其对观众有趣。是的,这很费力。在会议上,Maven 和 Gradle 的人员共同努力,分享关于两个系统中依赖管理技巧和最佳实践。请观看 Louis 和 Hervé Boutemy 的演讲 here(法语)。

alt_text

Gradle 9 中的关键领域 #

那么,我们对 Gradle 9 有什么期望呢?Louis 概述了他们为 Gradle 的下一个主要版本关注的几个关键领域

  • 🚀 性能
  • 💡 可理解性
  • 🐘 支持现代 Java 和 Kotlin 版本

配置缓存改进 #

一个主要的重点是继续配置缓存方面的工作,配置缓存已在 Gradle 8.1 中标记为稳定。在 Gradle 9.0 中,配置缓存将成为首选执行模式,并且禁用它将被弃用。这意味着每个构建都应该使用配置缓存功能,从而加快配置阶段并使构建总体上更快。

alt_text

Gradle 配置是构建的重要组成部分,因此需要配置缓存改进。

然而,这需要内部 Gradle 插件的大量努力,并适应并非总是兼容的用例。对于社区插件尤其如此。Gradle 团队将继续与社区就此进行协作。

有一个 GitHub issue 包含已知兼容插件和兼容性问题的列表,包括所有最流行的插件。Louis 鼓励社区查看它,如果您的收藏插件不兼容,请提及它。

用于更快配置的隔离项目 #

如果您获得缓存命中,配置缓存非常棒,但如果您没有,您仍然必须经历配置阶段。Gradle 团队的下一步是 隔离项目

由于 Gradle 的历史和可变模型,每当您进行更改时,实际上都必须重新运行整个配置。对于多模块构建来说,这可能是一个问题,即使某些模块没有更改。Android Studio 以其同步 Gradle 项目需要很长时间而闻名。

对于 隔离项目,目标是能够并行运行 Gradle 的配置阶段并增量缓存它。这将使 Gradle 能够在您修改构建逻辑时仅为受影响的项目重新运行配置阶段。

对于 Gradle 9,该团队计划发布一个孵化版本,供早期采用者试用。您还可以在孵化期间报告问题并请求支持其他模式。

Kotlin 2.0 集成 #

Gradle 团队希望将 Kotlin 2.0 集成到 Gradle 9 中,并利用 K2 编译器来加速 Kotlin 构建脚本的编译。Gradle 参与了 JetBrains 和 Kotlin 基金会组织的 Kotlin 2.0 早期访问计划。

Gradle 在 KotlinConf 开幕主题演讲中被强调为其他 Kotlin 2 EAP 冠军之一。照片由 Qian Jin 拍摄

alt_text

通常,Gradle 无法在 Gradle 的主要升级之外进行 Kotlin 的主要升级,因为它会影响兼容性。因此 Kotlin 2.0 将随 Gradle 9 一起推出。我们已经有了支持 Kotlin 2.0 的实验性构建,因此 nightly 构建可能会更早可用。

延迟 API 和字节码转换 #

Gradle 一直在推广一组延迟 API。这些 API 旨在解决评估和执行顺序(如 Provider API 中所示),并允许延迟评估属性,使您能够在配置阶段配置依赖项并在执行期间获得正确的值。

interface Extension {
  val description: Property<String>
}

// register "extension" with type Extension

extension {
  // Using the set() method call
  description.set("Hello Property")

  // Using lazy property assignment
  description = "Hello Property"
}

对于 Gradle 9,计划对新 API 进行重大迁移,确保现有插件仍然可以应用。其想法是在幕后使用字节码转换,允许以旧式 getter 和 setter 为目标的插件与 provider API 透明地工作。

到目前为止,Gradle 一直在逐个迁移属性,这涉及找到一个新名称,引入它,弃用旧名称,并最终在下一个主要版本中删除旧名称。这是一个漫长而具有破坏性的过程。借助 Gradle 9,该团队旨在进行最后一次重大更改,以简化此过程。由于其复杂性,是否可以为插件作者提供自动兼容性仍然不确定。

"Paul Merlin and presenting on Gradle 9 and Lazy API"

Java 版本支持 #

Gradle 旨在跟上新的 Java 版本。在 Gradle 8.7 中,您可以通过工具链机制使用 Java 22 来编译、运行和测试工具。但是,Gradle 依赖于 Groovy 和 Kotlin,它们也需要支持 Java 22。对 Java 22 的完全支持将在 Gradle 8.8 中提供。

对于 Java 23,Gradle 团队正在积极探索尽早提供支持的方法,理解用户可能希望尝试即将推出的 Java 版本的早期访问功能。鉴于当前的计划,Java 23 支持很可能在 9.0 版本中提供。

分享反馈 #

当被问及是否有任何技巧或建议要传达给 Gradle 用户时,Louis 强调了用户反馈的重要性

如果您在某个主题上遇到困难,您找不到正确的文档。请告诉我们。与一些其他的错误修复和功能请求相比,这通常更容易推进,并且可以帮助其他遇到相同挑战的人。

Gradle 团队已经启动了一些改进文档的举措

  • 一个新的反馈表单已经实施,允许您立即提交 GitHub 问题。很快,您将能够直接从文档中编辑和提交拉取请求
  • 文档更新速度更快,以便每个合并的拉取请求都将在当晚的当前版本中显示出来
  • 主要的文档计划,包括新的 Gradle Cookbook

非常欢迎任何与文档相关的贡献和报告!

总结 #

听到 Gradle 9 中即将到来的所有改进和新功能,从配置缓存增强到隔离项目、Kotlin 2.0 集成、延迟 API 和更好的 Java 版本支持,真是令人兴奋。非常感谢 Louis 在 Devoxx FR 繁忙的日程中分享这些见解。我们期待尽快看到 Gradle 9 候选版本和功能。

要了解有关 Gradle 计划的更多信息,请查看 Gradle 构建工具路线图。除了 Gradle 9 之外,我们还有很多其他事情要做。

与往常一样,Gradle 社区的反馈和贡献是无价的。因此,请尝试新功能,报告任何问题,并让 Gradle 团队知道您是否需要记录某些内容。共同努力,我们可以使 Gradle 9 成为有史以来最好的版本!

参考资料 #

Louis 的演讲

讨论