规则兼容性

报告问题 查看源代码 每夜版 · 8.4 · 8.3 · 8.2 · 8.1 · 8.0 · 7.6

在以下两种情况下,Bazel Starlark 规则可能会与 Bazel LTS 版本不兼容:

  1. 该规则会破坏与未来 LTS 版本的兼容性,因为其依赖的功能已从 HEAD 中的 Bazel 移除。
  2. 该规则与当前或较旧的 LTS 版本不兼容,因为它所依赖的功能仅在较新的 Bazel LTS 版本中提供。

与此同时,规则本身也可能会为用户提供不兼容的更改。如果 Bazel 中存在重大变更,升级规则版本和 Bazel 版本往往会让 Bazel 用户感到沮丧。本页介绍了规则作者应如何保持规则与 Bazel 的兼容性,以便用户更轻松地升级 Bazel 和规则。

可管理的迁移流程

虽然我们显然无法保证每个版本的 Bazel 与每个版本的规则之间的兼容性,但我们的目标是确保 Bazel 用户能够轻松完成迁移过程。可管理的迁移流程是指用户无需同时升级规则的主要版本和 Bazel 的主要版本的流程,从而允许用户一次处理来自一个来源的不兼容变更。

例如,对于以下兼容性矩阵:

  • 从 rules_foo 1.x + Bazel 4.x 迁移到 rules_foo 2.x + Bazel 5.x 被认为不可管理,因为用户需要同时升级 rules_foo 和 Bazel 的主要版本。
  • 从 rules_foo 2.x + Bazel 5.x 迁移到 rules_foo 3.x + Bazel 6.x 被认为是可管理的,因为用户可以先将 rules_foo 从 2.x 升级到 3.x,而无需更改 Bazel 主要版本,然后再将 Bazel 从 5.x 升级到 6.x。
rules_foo 1.x rules_foo 2.x rules_foo 3.x HEAD
Bazel 4.x
Bazel 5.x
Bazel 6.x
HEAD

❌:主要规则版本没有与 Bazel LTS 版本兼容的版本。

✅:规则的至少一个版本与最新版本的 Bazel LTS 版本兼容。

最佳做法

作为 Bazel 规则的作者,您可以遵循以下最佳实践,确保用户能够轻松完成迁移流程:

  1. 该规则应遵循语义化版本控制:同一主要版本的次要版本向后兼容。
  2. HEAD 中的规则应与最新的 Bazel LTS 版本兼容。
  3. HEAD 中的规则应与 HEAD 中的 Bazel 兼容。为此,您可以
    • 使用 HEAD 版本的 Bazel 设置您自己的 CI 测试
    • 将您的项目添加到 Bazel 下游测试;如果 Bazel 中的重大更改影响了您的项目,Bazel 团队会向您的项目提交问题,您必须遵循我们的下游项目政策,及时解决问题。
  4. 规则的最新主要版本必须与最新的 Bazel LTS 版本兼容。
  5. 新规则主要版本应与前一规则主要版本支持的最新 Bazel LTS 版本兼容。

实现第 2 点和第 3 点是最重要的任务,因为这样才能实现第 4 点和第 5 点。自然地。

为了更轻松地保持与 Bazel HEAD 和最新 Bazel LTS 版本的兼容性,规则作者可以:

  • 如需请求将向后兼容的功能反向移植到最新的 LTS 版本,请查看发布流程了解详情。
  • 使用 bazel_features 进行 Bazel 功能检测。

一般来说,采用推荐的方法后,规则应该能够针对 Bazel 不兼容的更改进行迁移,并使用 HEAD 中的新 Bazel 功能,而不会失去与最新 Bazel LTS 版本的兼容性。