規則相容性

回報問題 查看原始碼 夜間 7.4 ,直接在 Google Cloud 控制台實際操作。 7.3 7.2 7.1 7.0 6.5

在下列兩種情況下,Bazel Starlark 規則可能會與 Bazel LTS 版本不相容:

  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 升級至 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 設定自己的持續整合測試
    • 將專案新增至 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 版本的相容性。