在以下两种情况下,Bazel Starlark 规则可能会与 Bazel LTS 版本不兼容:
- 该规则与未来的 LTS 版本不兼容,因为它依赖的功能已从 Bazel 的 HEAD 中移除。
- 该规则会破坏与当前或更早的 LTS 版本的兼容性,因为 它所依赖的功能仅在较新的 Bazel LTS 版本中提供。
与此同时,规则本身也可能会向用户提供不兼容的更改。在结合 Bazel 中的破坏性更改时,升级规则版本 和 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 兼容 发布。
✅:至少有 1 个版本的规则与最新版本的 Bazel LTS 版本兼容。
最佳做法
作为 Bazel 规则的作者,您可以遵循以下最佳实践,确保为用户提供可管理的迁移流程:
- 该规则应遵循语义版本控制:同一 major 版本的 minor 版本向后兼容。
- HEAD 中的规则应与最新的 Bazel LTS 版本兼容。
- HEAD 中的规则应与 HEAD 的 Bazel 兼容。为此,您可以
- 使用 Bazel 在 HEAD 上设置自己的 CI 测试
- 将项目添加到 Bazel 下游 testing; 如果 Bazel 中的破坏性更改,Bazel 团队会向您的项目提交问题 因此您必须遵循我们的下游项目 政策 以便及时解决问题。
- 规则的最新主要版本必须与最新的 Bazel LTS 版本兼容。
- 规则的新主要版本应与规则的旧主要版本支持的最后一个 Bazel LTS 版本兼容。
实现 2. 和 3. 是最重要的任务,因为这有助于实现 4. 和 5.
为了更轻松地与 HEAD 上的 Bazel 和最新的 Bazel LTS 版本保持兼容性,规则作者可以:
- 请求向后兼容的功能以向后移植到最新 LTS 请参阅发布流程 了解详情。
- 使用 bazel_features 执行 Bazel 特征检测
一般来说,采用建议的方法后,规则应该能够针对 Bazel 不兼容的更改进行迁移,并使用 HEAD 中的新 Bazel 功能,而不会丢失与最新 Bazel LTS 版本的兼容性。