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 = "..."
)
A 和 B 這兩個依附元件都依附於不同版本的 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"}
)
你也可以使用這項機制加入鑽石。舉例來說,如果 A 和 B 具有相同的依附元件,但呼叫時使用不同的名稱,請在 myproject/WORKSPACE 中加入這些依附元件。
透過指令列覆寫存放區
如要透過指令列,使用本機存放區覆寫已宣告的存放區,請使用 --override_repository 旗標。使用這個標記會變更外部存放區的內容,但不會變更原始碼。
舉例來說,如要將 @foo 覆寫至本機目錄 /path/to/local/foo,請傳遞 --override_repository=foo=/path/to/local/foo 標記。
用途包括:
- 偵錯問題。舉例來說,將 http_archive存放區覆寫為本機目錄,方便您進行變更。
- Vendoring。如果您處於無法發出網路呼叫的環境,請覆寫以網路為準的存放區規則,改為指向本機目錄。
使用 Proxy
Bazel 會從 HTTPS_PROXY 和 HTTP_PROXY 環境變數中擷取 Proxy 位址,並使用這些位址下載 HTTP 和 HTTPS 檔案 (如有指定)。
支援 IPv6
在僅支援 IPv6 的機器上,Bazel 可以下載依附元件,不必進行任何變更。不過,在雙重堆疊 IPv4/IPv6 電腦上,Bazel 遵循與 Java 相同的慣例,如果啟用 IPv4,則會優先使用 IPv4。在某些情況下 (例如 IPv4 網路無法解析/連線至外部位址時),這可能會導致 Network
unreachable 例外狀況和建構失敗。在這種情況下,您可以使用 java.net.preferIPv6Addresses=true 系統屬性,覆寫 Bazel 的行為,偏好使用 IPv6。詳細說明:
- 使用 - --host_jvm_args=-Djava.net.preferIPv6Addresses=truestartup 選項,例如在- .bazelrc檔案中新增下列程式碼:- startup --host_jvm_args=-Djava.net.preferIPv6Addresses=true
- 執行需要連上網際網路的 Java 建構目標時 (例如整合測試),請使用 - --jvmopt=-Djava.net.preferIPv6Addresses=truetool flag。舉例來說,在- .bazelrc檔案中加入以下內容:- build --jvmopt=-Djava.net.preferIPv6Addresses
- 如果您使用 - rules_jvm_external進行依附元件版本解析,請將- -Djava.net.preferIPv6Addresses=true新增至- COURSIER_OPTS環境變數,為 Coursier 提供 JVM 選項。
離線建構
有時您可能希望離線執行建構作業,例如在飛機上旅行時。對於這類簡單的用途,請使用 bazel fetch 或 bazel sync 預先擷取所需存放區。如要在建構期間停用擷取其他存放區,請使用 --nofetch 選項。
如果是真正的離線建構,也就是由不同實體提供所有必要檔案,Bazel 支援 --distdir 選項。這個標記會告知 Bazel,當存放區規則要求 Bazel 使用 ctx.download 或 ctx.download_and_extract 擷取檔案時,請先查看該選項指定的目錄。提供所需檔案的雜湊總和後,Bazel 會尋找與第一個網址基本名稱相符的檔案,並在雜湊相符時使用本機副本。
Bazel 本身會使用這項技術,從發行版構件啟動離線作業。方法是收集內部 distdir_tar 中所有必要的外部依附元件。
Bazel 允許在存放區規則中執行任意指令,而不必瞭解這些指令是否會呼叫網路,因此無法強制執行完全離線的建構作業。如要測試建構作業是否能在離線狀態下正常運作,請手動封鎖網路 (如同 Bazel 在啟動測試中所做)。