廠商模式是 Bzlmod 的一項功能,可讓您建立 外部依附元件這種做法適用於離線建構作業 控制外部依附元件的來源
啟用供應商模式
您可以指定 --vendor_dir
旗標來啟用供應商模式。
例如,將檔案新增至 .bazelrc
檔案即可:
# Enable vendor mode with vendor directory under <workspace>/vendor_src
common --vendor_dir=vendor_src
供應商目錄可以是工作區根目錄的相對路徑,也可以是
供應商特定外部存放區
您可以使用 vendor
指令搭配 --repo
旗標來指定存放區
該供應商接受標準存放區
name 和 apparent repo
name:
舉例來說,您可以執行:
bazel vendor --vendor_dir=vendor_src --repo=@rules_cc
或
bazel vendor --vendor_dir=vendor_src --repo=@@rules_cc~
都會取得規則_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
目標所需的所有存放區
以及採用目前設定的 //src/test/...
下所有目標
實際上,系統會執行 bazel build --nobuild
指令來分析
因此,建構旗標可以套用至這個指令
會影響結果
離線建立目標
使用供應商提供的外部依附元件後,您可以透過下列方式離線建構目標:
bazel build --vendor_dir=vendor_src //src/main:hello-world //src/test/...
建構作業應可在沒有網路存取權且無網路存取權的建構環境中運作 存放區快取
因此,您應該可以檢查廠商來源,並建構相同的 並離線指定另一部電腦
供應商所有外部依附元件
如要廠商傳輸外部依附元件圖表中的所有存放區,您可以 執行:
bazel vendor --vendor_dir=vendor_src
請注意,廠商所有依附元件有幾個缺點:
- 擷取所有存放區 (包括間接導入的存放區) 可能相當費時。
- 供應商目錄可能會變得相當龐大。
- 如果部分存放區與目前平台或環境不相容,可能無法擷取。
因此,建議您優先考量特定目標。
使用 VENDOR.bazel 設定供應商模式
您可以使用位於這個區域的 VENDOR.bazel 檔案,控制指定存放區的處理方式 供應商目錄下。
可用的指令有兩種 標準存放區名稱做為引數:
ignore()
:從供應商模式完全忽略存放區。pin()
:將存放區固定在目前廠商提供的來源,就好像有某個存放區一樣 這個存放區的--override_repository
旗標。Bazel「不會」更新供應商提供的 除非未固定,否則這個存放區的原始碼。 使用者可以手動修改及維護這個存放區的廠商原始碼。
範例說明
ignore("@@rules_cc~")
pin("@@bazel_skylib~")
使用這項設定
- 這兩個存放區都將從後續的供應商指令中排除。
- 存放區
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 輸出基底之後 已變更。