与 Louis Jacomet 一起迈向 Gradle 9 之路

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

目录

引言

在 Devoxx France 大会上,我们与 Gradle Inc. 的技术负责人 Louis Jacomet 进行了会谈。Louis 领导着 Gradle 构建工具支持团队并协调发布,所以你经常能在 GitHub 问题上看到他活跃的身影,并在 Gradle 会议上发表演讲。让我们深入了解 Louis 对即将发布的 Gradle 9 版本分享了什么!

alt_text

Devoxx FR 忙碌的一天 #

周五在 Devoxx FR,Louis 的日程安排得满满当当,有 4 小时的演讲。他与 Apache Maven 社区的 Hervé Boutemy 共同进行了一小时的演讲,内容是关于如何在依赖管理迷宫中导航。他还与他的同事 Paul Merlin 进行了关于 Gradle 9 即将推出功能的独立讨论。

一次性准备这么多演讲绝非易事。正如 Louis 所说:思考你想说什么,组织好内容,准备酷炫的演示,并让观众觉得有趣。是的,这是一项工作。在大会上,Maven 和 Gradle 的工作人员通力合作,分享了两个系统中依赖管理的技巧和最佳实践。点击这里(法语)查看 Louis 和 Hervé Boutemy 的演讲

alt_text

Gradle 9 的重点领域 #

那么,Gradle 9 我们可以期待什么呢?Louis 概述了他们正在为 Gradle 的下一个主要版本重点关注的几个关键领域

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

配置缓存改进 #

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

alt_text

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

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

有一个GitHub 问题列出了已知兼容的插件和兼容性问题,包括所有最受欢迎的插件。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 早期访问计划。

在 KotlinConf 开幕主题演讲中,Gradle 与其他 Kotlin 2 EAP 冠军一起受到了突出介绍。图片来源:Qian Jin

alt_text

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

延迟 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 的演讲

讨论