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 包含兩個主要部分:
- 模組解析度的輸入內容,例如
moduleFileHash
、flags
和localOverrideHashes
,以及解析度的輸出內容moduleDepGraph
。 - 針對每個模組擴充功能,鎖定檔案會包含會影響模組的輸入內容,
以
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
。
這項對應中的每個項目都會對應到使用過的擴充功能,並由其識別 包含檔案和名稱每個項目的對應值都包含 與該擴充功能相關的資訊:
- 擴充功能實作項目及其摘要的
transitiveDigest
摘要 遞移 .bzl 檔案。 - 使用
generatedRepoSpecs
目前的輸入來源
其他可能影響擴充功能結果的因素為用途。 雖然未儲存在 Lockfile 中,但在比較時會將用量納入考量 擴充功能在 Lockfile 中的目前狀態
最佳做法
如果想充分發揮鎖定檔案功能的優點,請參考以下最佳做法 做法:
定期更新 Lockfile,反映專案依附元件的變更,或 此外還會從 0 自動調整資源配置 您完全不必調整資源調度設定這可確保後續建構是以 即時且準確的依附元件組合
在版本管控中納入 Lockfile,促進協作和 確保所有團隊成員都能存取相同的 Lockfile,進而 確保整個專案採用一致的開發環境
只要按照下列最佳做法操作,您就能有效利用 Lockfile 提升作業效率、可靠性與協同合作效率 軟體開發工作流程