供應商模式

回報問題 查看原始碼 。 。 。 。 夜間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 旗標來指定存放區 該供應商接受標準存放區 nameapparent 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 輸出基底之後 已變更。