供應商模式

7.3 · 7.2 · 7.1 · 7.0 · 6.5

供應商模式是 Bzlmod 的功能,可讓您建立外部依附元件的本機副本。這項功能適用於離線建構作業,或您想控管外部依附元件的來源時。

啟用供應商模式

您可以指定 --vendor_dir 標記來啟用供應商模式。

例如,將其新增至 .bazelrc 檔案:

# Enable vendor mode with vendor directory under <workspace>/vendor_src
common --vendor_dir=vendor_src

供應商目錄可以是工作區根目錄的相對路徑,也可以是絕對路徑。

供應商特定外部存放區

您可以使用 vendor 指令搭配 --repo 旗標來指定要供應商的存放區,此指令可接受標準存放區名稱apparent 存放區名稱

例如執行以下指令:

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 模組解析作業,才能擷取外部依附元件,這可能需要透過網際網路存取登錄檔案。為了達成離線建構,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 輸出基底變更,廠商來源中的符號連結應可正常運作。