規則相容性

回報問題 查看原始碼 。 。 。 。 夜間。 。 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 升級到 在不變更主要 Bazel 版本的情況下使用 3.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 相容 版本。

✅:有一個以上的規則版本與最新版 Bazel LTS 版本。

最佳做法

身為 Bazel 規則的作者,可確保使用者擁有易於管理的遷移程序 操作步驟如下:

  1. 規則應依循 Semantic 版本管理:相同內容的子版本 主要版本具有回溯相容性
  2. HEAD 的規則應與最新的 Bazel LTS 版本相容。
  3. HEAD 中的規則應與 HEAD 的 Bazel 相容。為了達成這個目標 你可以
    • 在 HEAD 上使用 Bazel 設定您自己的持續整合測試
    • 將專案新增至 Bazel 下游 testing; Bazel 團隊會在 Bazel 發生破壞性變更時,向您的專案發出通知 影響您的專案,請務必依循我們的下游專案 政策 即時解決問題
  4. 規則的最新主要版本必須相容於最新版 Bazel LTS 版本。
  5. 規則的新主要版本應與上次的 Bazel LTS 相容 上一個主要版本支援的版本。

達成 2. 和 3 步是最重要的任務,因為這能達成 4 個目標。 5. AI 必須採行 隱私保護設計原則自然流暢

為方便在 HEAD 和最新版的 Bazel 與 Bazel 保持相容 在 Bazel LTS 版本中,規則作者可以:

  • 要求回溯相容功能,以便向後移植至最新的 LTS 請參閱發布程序 ,掌握更多詳細資訊。
  • 使用 bazel_features 以便偵測 Bazel 功能

一般來說,我們建議的做法 Bazel 不支援不相容的變更,並在 HEAD 導入新的 Bazel 功能 因此不會出現與最新 Bazel LTS 版本的相容性。