在下列兩種情況下,Bazel Starlark 規則可能會與 Bazel LTS 版本不相容:
- 這項規則會破壞與日後 LTS 版本的相容性,因為 Bazel HEAD 中已移除規則所依附的功能。
- 這項規則會破壞與目前或舊版 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 規則作者,您可以遵循下列最佳做法,確保使用者能順利完成遷移程序:
- 規則應遵循語意版本管理:相同主版本的次要版本可向後相容。
- HEAD 的規則應與最新的 Bazel LTS 版本相容。
- HEAD 的規則應與 HEAD 的 Bazel 相容。如要達成這個目標,
可以
- 使用 HEAD 的 Bazel 設定自己的 CI 測試
- 將專案新增至 Bazel 下游測試;如果 Bazel 的重大變更影響專案,Bazel 團隊會將問題歸檔至專案,您必須遵守我們的下游專案政策,及時解決問題。
- 規則的最新主要版本必須與最新的 Bazel LTS 版本相容。
- 新版規則應與舊版規則支援的最新 Bazel LTS 版本相容。
達成第 2 和第 3 點是最重要的工作,因為這樣才能達成第 4 和第 5 點。自然。
為方便規則作者同時維持與 Bazel HEAD 和最新 Bazel LTS 版本的相容性,他們可以:
- 如要要求將回溯相容功能回溯移植到最新 LTS 版本,請參閱發布程序瞭解詳情。
- 使用 bazel_features 偵測 Bazel 功能。
一般來說,採用建議方法後,規則應能因應 Bazel 不相容的變更進行遷移,並在 HEAD 中使用新的 Bazel 功能,同時維持與最新 Bazel LTS 版本的相容性。