规则兼容性

报告问题 查看来源 每晚 · 7.2。 · 7.1敬上 · 7.0 · 6.5 · 6.4

Bazel Starlark 规则可能会破坏与 以下两种情况:

  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 升级到 将 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 兼容。为此, 你可以 <ph type="x-smartling-placeholder">
      </ph>
    • 在 HEAD 上使用 Bazel 设置您自己的 CI 测试
    • 将项目添加到 Bazel 下游 测试; 如果 Bazel 中的破坏性更改,Bazel 团队会向您的项目提交问题 因此您必须遵循我们的下游项目 政策 以便及时解决问题。
  4. 规则的最新主要版本必须与应用的最新版本兼容 Bazel LTS 版本。
  5. 规则的新主要版本应与上一个 Bazel LTS 兼容 规则的上一主要版本所支持的版本。

实现 2. 和 3. 是最重要的任务,因为这可以实现 4. 和 5.

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

  • 请求向后兼容的功能以向后移植到最新 LTS 请参阅发布流程 了解详情。
  • 使用 bazel_features 执行 Bazel 特征检测

一般来说,使用推荐的方法,规则应该能够迁移 不支持 Bazel 更改,在 HEAD 中使用新的 Bazel 功能,但 与最新 Bazel LTS 版本的兼容性。