供應商模式是 Bzlmod 的功能,可讓您建立外部依附元件的本機副本。這項功能適用於離線建構作業,或您想要控管外部依附元件的來源時。
啟用供應商模式
您可以指定 --vendor_dir
標記來啟用供應商模式。
例如,將其新增至 .bazelrc
檔案:
# Enable vendor mode with vendor directory under <workspace>/vendor_src
common --vendor_dir=vendor_src
供應商目錄可以是工作區根目錄的相對路徑,也可以是絕對路徑。
供應商特定外部存放區
您可以使用 vendor
指令搭配 --repo
旗標,指定要供應商的 repo,它同時接受標準 repo 名稱和明顯的 repo 名稱。
例如執行以下指令:
bazel vendor --vendor_dir=vendor_src --repo=@rules_cc
或
bazel vendor --vendor_dir=vendor_src --repo=@@rules_cc+
都會將 rules_cc 供應至 <workspace root>/vendor_src/rules_cc+
下。
指定目標的供應商外部依附元件
如要供應建構特定目標模式所需的所有外部依附元件,您可以執行 bazel vendor <target patterns>
。
範例說明
bazel vendor --vendor_dir=vendor_src //src/main:hello-world //src/test/...
供應商會提供建構 //src/main:hello-world
目標所需的所有 repos,以及 //src/test/...
下所有目標的目前設定。
實際上,它會執行 bazel build --nobuild
指令來分析目標模式,因此建構標記可套用至此指令,並影響結果。
離線建構目標
有了外部供應商的依附元件,您可以透過以下方式離線建構目標:
bazel build --vendor_dir=vendor_src //src/main:hello-world //src/test/...
建構作業應在沒有網路存取和存放區快取的簡潔式建構環境中運作。
因此,您應該可以檢查供應商來源,並在其他電腦上離線建構相同的目標。
供應所有外部依附元件
如要供應轉介外部依附元件圖表中的所有 repos,您可以執行:
bazel vendor --vendor_dir=vendor_src
請注意,供應商提供所有依附元件會帶來一些缺點:
- 擷取所有存放區 (包括間接引入的存放區) 可能會耗時。
- 供應商目錄可能會變得非常大。
- 如果某些儲存庫與目前平台或環境不相容,可能會發生擷取失敗的情形。
因此,請先考慮為特定目標對象提供供應商。
使用 VENDOR.bazel 設定供應商模式
您可以透過供應商目錄下的 VENDOR.bazel 檔案,控制如何處理特定存放區。
您可以使用兩種指令,兩者都接受標準存放區名稱清單做為引數:
ignore()
:完全忽略供應商模式中的存放區。pin()
:將存放區釘選至其目前的供應商來源,就像這個存放區有--override_repository
標記一樣。在執行供應商指令時,Bazel 不會更新此存放區的供應商來源,除非該來源已解除固定。使用者可以手動修改及維護此存放區的供應商來源。
範例說明
ignore("@@rules_cc+")
pin("@@bazel_skylib+")
使用這項設定
- 後續供應商指令將排除這兩個存放區。
- Repo
bazel_skylib
會覆寫供應商目錄下方的來源。 - 使用者可以安全地修改供應商提供的
bazel_skylib
來源。 - 如要重新供應
bazel_skylib
,使用者必須先停用 PIN 陳述式。
瞭解供應商模式的運作方式
Bazel 會擷取 $(bazel info
output_base)/external
下專案的外部依附元件。外部依附元件的供應商化,是指將相關檔案和目錄移至指定的供應商目錄,並在日後的建構作業中使用供應商化來源。
供應商內容包括:
- 存放區目錄
- 存放區標記檔案
在建構期間,如果供應商標記檔案為最新版本,或已在 VENDOR.bazel 檔案中固定存放庫,則 Bazel 會透過在 $(bazel info output_base)/external
下建立供應商來源的符號連結,而非實際執行存放庫規則,使用供應商來源。否則,系統會顯示警告,並改為擷取最新版本的存放區。
供應商登錄檔案
Bazel 必須執行 Bazel 模組解析作業,才能擷取外部依附元件,這可能需要透過網際網路存取登錄檔案。為了達成離線建構,Bazel 供應商會從網路擷取的所有登錄檔案,並儲存在 <vendor_dir>/_registries
目錄下。
供應商符號連結
外部存放區可能包含指向其他檔案或目錄的符號連結。為確保符號連結正常運作,Bazel 會使用下列策略,在供應商來源中重寫符號連結:
- 建立指向
$(bazel info output_base)/external
的符號連結<vendor_dir>/bazel-external
。每個 Bazel 指令都會自動重新整理。 - 針對供應商來源,將所有原本指向
$(bazel info output_base)/external
下路徑的符號連結,重寫為<vendor_dir>/bazel-external
下相對路徑。
舉例來說,如果原始符號連結是
<vendor_dir>/repo_foo+/link => $(bazel info output_base)/external/repo_bar+/file
系統會將其改寫為
<vendor_dir>/repo_foo+/link => ../../bazel-external/repo_bar+/file
媒介
<vendor_dir>/bazel-external => $(bazel info output_base)/external # This might be new if output base is changed
由於 <vendor_dir>/bazel-external
是由 Bazel 自動產生,建議您將其新增至 .gitignore
或等效項目,以免將其簽入。
採用這項策略後,即使供應商來源已移至其他位置或 Bazel 輸出基地已變更,供應商來源中的符號連結仍應能正常運作。