供應商模式

回報問題 查看來源 Nightly · 8.3 · 8.2 · 8.1 · 8.0 · 7.6

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

啟用供應商模式

指定 --vendor_dir 旗標即可啟用供應商模式。

舉例來說,您可以將這個資料庫新增至您的 .bazelrc 檔案:

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

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

供應特定外部存放區

您可以使用 vendor 指令搭配 --repo 旗標,指定要供應的存放區,並接受標準存放區名稱顯而易見的存放區名稱

舉例來說,執行:

bazel vendor --vendor_dir=vendor_src --repo=@rules_cc

bazel vendor --vendor_dir=vendor_src --repo=@@rules_cc+

都會取得要以 <workspace root>/vendor_src/rules_cc+ 形式供應的 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 目錄可能會變得非常龐大。
  • 如果某些存放區與目前的平台或環境不相容,可能就無法擷取。

因此,請先考慮特定目標的供應商。

使用 VENDOR.bazel 設定供應商模式

您可以透過 vendor 目錄下的 VENDOR.bazel 檔案,控管特定存放區的處理方式。

有兩個可用的指令,兩者都接受標準存放區名稱清單做為引數:

  • ignore():從供應商模式完全忽略存放區。
  • pin():將存放區固定至目前的供應商來源,就像這個存放區有 --override_repository 標記一樣。執行 vendor 指令時,Bazel 不會更新這個存放區的供應來源 (除非取消釘選)。使用者可以手動修改及維護這個存放區的供應商來源。

例如

ignore("@@rules_cc+")
pin("@@bazel_skylib+")

完成這項設定後

  • 後續的供應商指令都會排除這兩個存放區。
  • 存放區 bazel_skylib 會覆寫至 vendor 目錄下的來源。
  • 使用者可以安全地修改 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 輸出基礎變更,供應商來源中的符號連結仍應正常運作。