在下列兩種情況下,Bazel Starlark 規則可能會與 Bazel LTS 版本不相容:
- 由於所依附的功能已從 HEAD 版的 Bazel 中移除,因此這項規則會與日後的 LTS 版本不相容。
- 這項規則會破壞與目前或舊版 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 設定自己的持續整合測試
- 將專案加入 Bazel 的後端測試;如果 Bazel 的重大變更會影響您的專案,Bazel 團隊會將問題提交給您的專案,而您必須遵循我們的後端專案政策,才能及時解決問題。
- 規則的最新主要版本必須與最新的 Bazel LTS 版本相容。
- 規則的新主要版本應與先前主要版本的規則支援的最新 Bazel LTS 版本相容。
達成 2. 和 3. 是最重要的任務,因為這可讓您達成 4. 和 5. 自然地。
為讓您更輕鬆地維持與 HEAD 版 Bazel 和最新 Bazel LTS 版本的相容性,規則作者可以:
- 請要求將向後相容的功能回移至最新的 LTS 版本,詳情請參閱發布程序。
- 使用 bazel_features 進行 Bazel 功能偵測。
一般來說,只要採用建議的方法,規則就能遷移 Bazel 不相容的變更,並在 HEAD 使用新的 Bazel 功能,且不會影響與最新 Bazel LTS 版本的相容性。