规则兼容性

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

  1. 该规则破坏了与未来 LTS 版本的兼容性,因为它所依赖的功能已从 Bazel 的 HEAD 分支中移除。
  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 分支中的规则应与 Bazel 的 HEAD 分支兼容。为此, 您可以
    • 使用 Bazel 的 HEAD 分支设置自己的 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 版本的兼容性。