外部依附元件的進階主題

回報問題 查看原始碼 。 。 。 。 夜間7.3 。 。 7.2 。 。 7.1 。 。 7.0 。 。 6.5

WORKSPACE 中的影子依附元件

請盡可能在專案中設定單一版本政策, 需要進行編譯,且最終可在最終階段 二進位檔案。在其他情況下,您可以遮蔽依附元件:

我的專案/工作區

workspace(name = "myproject")

local_repository(
    name = "A",
    path = "../A",
)
local_repository(
    name = "B",
    path = "../B",
)

空調

workspace(name = "A")

load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
http_archive(
    name = "testrunner",
    urls = ["https://github.com/testrunner/v1.zip"],
    sha256 = "...",
)

B/工作區

workspace(name = "B")

load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
http_archive(
    name = "testrunner",
    urls = ["https://github.com/testrunner/v2.zip"],
    sha256 = "..."
)

AB 都依附於 testrunner 的不同版本。 在「myproject」中納入這兩個類別,而不發生衝突,也就是為兩個值指定不重複的名稱 myproject/WORKSPACE:

workspace(name = "myproject")

load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
http_archive(
    name = "testrunner-v1",
    urls = ["https://github.com/testrunner/v1.zip"],
    sha256 = "..."
)
http_archive(
    name = "testrunner-v2",
    urls = ["https://github.com/testrunner/v2.zip"],
    sha256 = "..."
)
local_repository(
    name = "A",
    path = "../A",
    repo_mapping = {"@testrunner" : "@testrunner-v1"}
)
local_repository(
    name = "B",
    path = "../B",
    repo_mapping = {"@testrunner" : "@testrunner-v2"}
)

你也可以使用這個機制加入鑽石。例如,如果 AB 依附元件相同,但以不同名稱呼叫,然後彙整這些依附元件 位置:myproject/WORKSPACE

透過指令列覆寫存放區

如要透過指令列使用本機存放區覆寫宣告的存放區, 請使用 --override_repository敬上 旗標。使用此旗標時,系統會變更外部存放區的內容 並變更原始碼

舉例來說,如要將 @foo 覆寫為本機目錄 /path/to/local/foo, 傳遞 --override_repository=foo=/path/to/local/foo 標記。

用途包括:

  • 偵錯。例如,如要將 http_archive 存放區覆寫為 讓您輕鬆變更設定。
  • 供應商。如果您所在的環境無法進行網路呼叫, 覆寫以網路為基礎的存放區規則,指向本機目錄 。
,瞭解如何調查及移除這項存取權。

使用 Proxy

Bazel 會從 HTTPS_PROXYHTTP_PROXY 挑選 Proxy 位址 環境變數,並使用這些環境變數來下載 HTTPHTTPS 檔案 (如果 )。

支援 IPv6

在僅限 IPv6 的機器上,Bazel 可以下載依附元件,無須進行任何變更。不過 在雙重堆疊 IPv4/IPv6 機器上 Bazel 都會遵循與 Java 相同的慣例 系統會優先使用 IPv4在某些情況下,例如當 IPv4 時 網路無法解析/連線至外部位址,這可能會導致 Network unreachable 例外狀況並建構失敗。在這些情況下,您可以覆寫 Bazel 的行為會優先使用 java.net.preferIPv6Addresses=true 系統 屬性。 詳細說明:

  • 使用 --host_jvm_args=-Djava.net.preferIPv6Addresses=true 啟動 選項,例如將 .bazelrc 的下一行:

    startup --host_jvm_args=-Djava.net.preferIPv6Addresses=true

  • 執行需要連線到網際網路的 Java 建構目標 (例如 進行整合測試時,請使用 --jvmopt=-Djava.net.preferIPv6Addresses=true 工具 旗標。舉例來說,您可以在 .bazelrc 檔案

    build --jvmopt=-Djava.net.preferIPv6Addresses

  • 如果您使用 rules_jvm_external 依附元件版本解析,也會新增 從 -Djava.net.preferIPv6Addresses=trueCOURSIER_OPTS 環境 變數,提供 JVM 選項 Coursier

離線版本

有時候,您可能會想離線執行建構,例如,當您在某個 飛機。針對這種簡單的用途,請使用以下指令預先擷取所需的存放區 bazel fetchbazel sync。如何在以下期間停止擷取其他存放區 建構,請使用 --nofetch 選項。

至於真正的離線版本,不同實體提供所有需要的檔案, Bazel 支援 --distdir 選項。這個標記會指示 Bazel 優先要查詢 當存放區規則要求 Bazel 要求 Bazel 時,由該選項指定的目錄 使用 ctx.downloadctx.download_and_extract。變更者: Bazel 會查詢所需檔案的雜湊總和 第一個網址的基準名稱,並在雜湊相符時使用本機副本。

Bazel 本身會使用這項技術,從發行 Artifact。 方法在於收集所有需要的外部 依附元件 在內部 distdir_tar

Bazel 允許在存放區規則中執行任意指令,而無需不知情 當他們呼叫網路,因此無法強制執行完全離線版本。目的地: 測試某個建構作業是否能離線正常運作,手動封鎖網路 ( Bazel 在啟動程序中執行 測試)。