規則相容性

回報問題 查看來源 Nightly · 8.4 · 8.3 · 8.2 · 8.1 · 8.0 · 7.6

在下列兩種情況下,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 的規則應與 HEAD 的 Bazel 相容。如要達成這個目標, 可以
    • 使用 HEAD 的 Bazel 設定自己的 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 版本的相容性。