与 Louis Jacomet 一起迈向 Gradle 9

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

alt_text

Devoxx FR 的繁忙的一天

路易斯在 Devoxx FR 的周五日程排得满满当当,安排了 4 个小时的演讲。他与 Apache Maven 社区的埃尔维·布特米 (Hervé Boutemy) 共同进行了一场关于如何应对依赖管理迷宫的 1 小时演讲。他还与同事保罗·梅林 (Paul Merlin) 进行了单独讨论,主题是 Gradle 9 的即将发布的功能。

为如此多的演讲做准备并非易事。正如路易斯所说:思考你想说的话,组织它,准备一些酷炫的演示,并让它对观众来说有趣。是的,这是一项工作。 在会议上,Maven 和 Gradle 的人员共同分享了关于这两个系统中依赖管理的技巧和最佳实践。请查看路易斯和埃尔维·布特米 (Hervé Boutemy) 的演讲 这里(法语)。

alt_text

Gradle 9 的关键领域

那么,我们可以在 Gradle 9 中期待什么呢?路易斯概述了他们在这个 Gradle 的下一个主要版本中关注的一些关键领域。

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

配置缓存改进

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

alt_text

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

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

有一个 GitHub 问题,其中列出了已知兼容插件和兼容性问题,包括所有最流行的插件。路易斯鼓励社区查看它,如果你的最爱插件不兼容,请提及它。

隔离项目以实现更快的配置

如果命中缓存,配置缓存非常棒,但如果你没有命中,你仍然需要经历配置阶段。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 冠军一起被重点介绍。照片由 钱进 拍摄

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 的插件透明地与提供者 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 食谱

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

总结

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

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

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

参考资料

Louis 的演讲

讨论