外部依附元件的進階主題

回報問題 查看原始碼 Nightly · 8.0 . 7.4 . 7.3 · 7.2 · 7.1 · 7.0 · 6.5

在 WORKSPACE 中遮蔽依附元件

請盡可能在專案中採用單一版本政策,這項政策適用於您用來編譯依附元件,並最終納入最終二進位檔的依附元件。在其他情況下,您可以遮蔽依附元件:

myproject/WORKSPACE

workspace(name = "myproject")

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

A/WORKSPACE

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

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/WORKSPACE 中為兩者指定不同的名稱,即可在 myproject 中同時加入這兩個元素,而不會發生衝突:

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 環境變數中挑選代理伺服器位址,並使用這些位址下載 HTTPHTTPS 檔案 (如果指定)。

支援 IPv6

在僅支援 IPv6 的電腦上,Bazel 可以下載依附元件,且不會發生任何變更。不過,在雙重堆疊 IPv4/IPv6 機器上,Bazel 會遵循與 Java 相同的慣例,在啟用時優先使用 IPv4。在某些情況下,例如 IPv4 網路無法解析/存取外部位址時,這可能會導致 Network unreachable 例外狀況和建構失敗。在這種情況下,您可以使用 java.net.preferIPv6Addresses=true 系統屬性覆寫 Bazel 偏好使用 IPv6 的行為。詳細說明:

  • 使用 --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=true 新增至 COURSIER_OPTS 環境變數,以為 Coursier 提供 JVM 選項

離線版本

有時您可能會想在離線狀態下執行建構作業,例如在搭乘飛機時。針對這類簡單用途,請使用 bazel fetchbazel sync 預先擷取所需的存放區。如要停用在建構期間擷取其他存放區的功能,請使用 --nofetch 選項。

對於真正的離線建構作業,也就是由其他實體提供所有所需檔案的情況,Bazel 支援 --distdir 選項。當存放區規則要求 Bazel 使用 ctx.downloadctx.download_and_extract 擷取檔案時,這個標記會告訴 Bazel 先查看該選項指定的目錄。只要提供所需檔案的雜湊總和,Bazel 就會尋找與第一個網址的 base 名稱相符的檔案,並在雜湊相符時使用本機副本。

Bazel 本身會使用這項技術,從發布構件啟動離線作業。方法是在內部 distdir_tar收集所有必要的外部依附元件

Bazel 允許在存放區規則中執行任意指令,但不會知道這些指令是否會呼叫網路,因此無法強制執行完全離線的建構作業。如要測試版本是否可在離線狀態下正常運作,請手動封鎖網路 (就像 Bazel 在引導測試中所做的那樣)。