Bazel Lockfile

回報問題 查看原始碼 。 。 。 。 夜間。 。 7.3 。 。 7.2 。 。 7.1 。 。 7.0 。 。 6.5

Bazel 的 Lockfile 功能可記錄特定版本的 軟體程式庫或套件的依附元件。這項服務 透過儲存模組解析度和擴充功能的結果 以及成效評估Lockfile 提倡可重現的版本,確保一致性 開發環境此外,生成式 AI 也能提升建構效率 Bazel 會在專案沒有變更時略過解決程序 依附元件此外, Lockfile 會防止系統 導致外部程式庫出現非預期的更新或破壞性變更 出錯的風險

產生鎖定檔案

這個 Lockfile 會在工作區根目錄下產生,並命名為 MODULE.bazel.lock。會在建構程序中建立或更新 特別是在模組解析和擴充功能評估之後。這個 Lockfile 擷取專案目前的狀態,包括 MODULE 檔案、旗標 及其他相關資訊值得注意的是,它只包含 目前版本叫用中包含的依附元件。

當影響其依附元件的專案發生變更時, Lockfile 會 並自動更新以反映新的狀態。這可確保 Lockfile 仍然專注於目前所需的特定依附元件組合 針對專案的解決狀況提供準確呈現的結果 依附元件

鎖定檔案使用方式

你可以使用旗標控制 Lockfile --lockfile_mode 到 自訂 Bazel 在專案狀態與 鎖定檔案。可用的模式如下:

  • update (預設):如果專案狀態與 Lockfile 相符, 系統會立即從 Lockfile 傳回解析度結果。否則 ,並更新 Lockfile 檔案,反映目前的 時間。
  • error:如果專案狀態與 Lockfile 相符,則解析結果為 從 Lockfile 傳回的物件否則 Bazel 會擲回錯誤,指出 建立一個變化版本這個模式 如要確保專案的依附元件 並將所有差異視為錯誤
  • off:完全未檢查鎖定檔案。

鎖定檔案的優點

Lockfile 提供多項優點,且可多種運用方式:

  • 可重現的版本。擷取特定版本或依附元件 軟體程式庫的安全漏洞,鎖檔可確保版本可重現 在不同環境之間執行不斷變化開發人員可以放心 確保專案建構過程一致且可預測。

  • 有效率地略過解決方案。Lockfile 可讓 Bazel 略過 如果專案依附元件沒有變更,則解決方式為錯誤 最後一個版本這可大幅改善建構效率,特別是 有時要解決這些問題並不容易。

  • 穩定性與風險降低:Lockfile 透過 防止外部程式庫意外更新或破壞性變更變更者: 將依附元件鎖定在特定版本,可能會導致發生錯誤的風險 因為不相容或未經測試的更新,也會減少。

Lockfile 內容

Lockfile 包含判斷 專案狀態已變更其中也包括專案建構的結果 維持目前狀態Lockfile 包含兩個主要部分:

  1. 模組解析度的輸入內容,例如 moduleFileHashflagslocalOverrideHashes,以及解析度的輸出內容 moduleDepGraph
  2. 針對每個模組擴充功能,鎖定檔案會包含會影響模組的輸入內容, 以 transitiveDigest 表示,以及執行該擴充功能的輸出內容 統稱為 generatedRepoSpecs

以下示範鎖定檔案的結構,並 各部分的說明:

{
  "lockFileVersion": 1,
  "moduleFileHash": "b0f47b98a67ee15f9.......8dff8721c66b721e370",
  "flags": {
    "cmdRegistries": [
      "https://bcr.bazel.build/"
    ],
    "cmdModuleOverrides": {},
    "allowedYankedVersions": [],
    "envVarAllowedYankedVersions": "",
    "ignoreDevDependency": false,
    "directDependenciesMode": "WARNING",
    "compatibilityMode": "ERROR"
  },
  "localOverrideHashes": {
    "bazel_tools": "b5ae1fa37632140aff8.......15c6fe84a1231d6af9"
  },
  "moduleDepGraph": {
    "<root>": {
      "name": "",
      "version": "",
      "executionPlatformsToRegister": [],
      "toolchainsToRegister": [],
      "extensionUsages": [
        {
          "extensionBzlFile": "extension.bzl",
          "extensionName": "lockfile_ext"
        }
      ],
      ...
    }
  },
  "moduleExtensions": {
    "//:extension.bzl%lockfile_ext": {
      "transitiveDigest": "oWDzxG/aLnyY6Ubrfy....+Jp6maQvEPxn0pBM=",
      "generatedRepoSpecs": {
        "hello": {
          "bzlFile": "@@//:extension.bzl",
          ...
        }
      }
    }
  }
}

模組檔案雜湊

moduleFileHash 代表 MODULE.bazel 檔案內容的雜湊。如果 這個檔案發生任何變更,雜湊值都會有所不同。

旗幟

Flags 物件會儲存會影響解析度結果的所有旗標。

本機覆寫雜湊

如果根模組包含 local_path_overrides,這個區段會儲存雜湊 本機存放區中的 MODULE.bazel 檔案可讓你追蹤變更 這個依附元件的結構

模組依附元件圖

moduleDepGraph 代表使用 執行 YAML 檔案可形成所有模組的依附元件圖 執行專案所需的指令

模組擴充功能

moduleExtensions 部分為僅包含所用擴充功能的地圖 系統在目前的叫用或先前叫用中叫用,同時排除任何擴充功能 不再使用也就是說,未使用擴充功能 從依附元件圖表中移除moduleExtensions

這項對應中的每個項目都會對應到使用過的擴充功能,並由其識別 包含檔案和名稱每個項目的對應值都包含 與該擴充功能相關的資訊:

  1. 擴充功能實作項目及其摘要的 transitiveDigest 摘要 遞移 .bzl 檔案。
  2. 使用generatedRepoSpecs 目前的輸入來源

其他可能影響擴充功能結果的因素為用途。 雖然未儲存在 Lockfile 中,但在比較時會將用量納入考量 擴充功能在 Lockfile 中的目前狀態

最佳做法

如果想充分發揮鎖定檔案功能的優點,請參考以下最佳做法 做法:

  • 定期更新 Lockfile,反映專案依附元件的變更,或 此外還會從 0 自動調整資源配置 您完全不必調整資源調度設定這可確保後續建構是以 即時且準確的依附元件組合

  • 在版本管控中納入 Lockfile,促進協作和 確保所有團隊成員都能存取相同的 Lockfile,進而 確保整個專案採用一致的開發環境

只要按照下列最佳做法操作,您就能有效利用 Lockfile 提升作業效率、可靠性與協同合作效率 軟體開發工作流程