在 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(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
存放區覆寫至本機目錄,讓存放區可以輕鬆進行變更,就適用這個做法。 - 供應商。如果您在無法發出網路呼叫的環境中,請將網路存放區規則覆寫為指向本機目錄。
使用 Proxy
Bazel 會從 HTTPS_PROXY
和 HTTP_PROXY
環境變數取得 Proxy 位址,並使用這些位址下載 HTTP
和 HTTPS
檔案 (如有指定)。
支援 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
環境變數,以便為路徑提供 JVM 選項。
離線版本
您有時可能會想離線執行建構作業,例如搭乘飛機時。如果是這類簡易用途,請使用 bazel fetch
或 bazel sync
預先擷取所需存放區。如要在建構期間停用擷取更多存放區的功能,請使用 --nofetch
選項。
針對真正的離線建構作業,而另一個實體可提供所有必要的檔案,Bazel 支援 --distdir
選項。這個旗標會指示 Bazel 在存放區規則要求 Bazel 使用 ctx.download
或 ctx.download_and_extract
擷取檔案時,先查看該選項指定的目錄。Bazel 會針對需要的檔案提供雜湊總和,尋找與第一個網址基本名稱相符的檔案,並在雜湊相符時使用本機副本。
Bazel 本身會使用這項技術,從發行成果離線啟動。方法是在內部 distdir_tar
中收集所有所需的外部依附元件。
Bazel 可在存放區規則內執行任意指令,但無需知道這些指令是否連線至網路,因此也無法強制執行完全離線的建構作業。如要測試建構作業是否可在離線狀態下正常運作,請手動封鎖網路 (正如 Bazel 在啟動程序測試中執行)。