Ẩn các phần phụ thuộc trong WORKSPACE
Bất cứ khi nào có thể, hãy áp dụng một chính sách phiên bản duy nhất trong dự án của bạn. Chính sách này là bắt buộc đối với các phần phụ thuộc mà bạn biên dịch và kết thúc trong tệp nhị phân cuối cùng. Đối với các trường hợp khác, bạn có thể ẩn các phần phụ thuộc:
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 = "..."
)
Cả hai phần phụ thuộc A và B đều phụ thuộc vào các phiên bản testrunner khác nhau.
Hãy đưa cả hai phần phụ thuộc vào myproject mà không gây xung đột bằng cách đặt tên riêng biệt cho chúng trong
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"}
)
Bạn cũng có thể sử dụng cơ chế này để kết hợp các phần phụ thuộc. Ví dụ: nếu A và B
có cùng một phần phụ thuộc nhưng gọi bằng các tên khác nhau, hãy kết hợp các phần phụ thuộc đó
trong myproject/WORKSPACE.
Ghi đè kho lưu trữ từ dòng lệnh
Để ghi đè một kho lưu trữ đã khai báo bằng một kho lưu trữ cục bộ từ dòng lệnh,
sử dụng
--override_repository
cờ. Việc sử dụng cờ này sẽ thay đổi nội dung của các kho lưu trữ bên ngoài mà không thay đổi mã nguồn của bạn.
Ví dụ: để ghi đè @foo thành thư mục cục bộ /path/to/local/foo,
hãy truyền cờ --override_repository=foo=/path/to/local/foo.
Các trường hợp sử dụng bao gồm:
- Gỡ lỗi các vấn đề. Ví dụ: để ghi đè một kho lưu trữ
http_archivethành một thư mục cục bộ mà bạn có thể dễ dàng thay đổi hơn. - Bán hàng. Nếu bạn đang ở trong một môi trường mà bạn không thể thực hiện lệnh gọi mạng, hãy ghi đè các quy tắc kho lưu trữ dựa trên mạng để trỏ đến các thư mục cục bộ.
Sử dụng proxy
Bazel chọn địa chỉ proxy từ các biến môi trường HTTPS_PROXY và HTTP_PROXY
rồi sử dụng các địa chỉ này để tải tệp HTTP và HTTPS xuống (nếu
được chỉ định).
Hỗ trợ IPv6
Trên các máy chỉ có IPv6, Bazel có thể tải các phần phụ thuộc xuống mà không cần thay đổi. Tuy nhiên, trên các máy có ngăn xếp kép IPv4/IPv6, Bazel tuân theo cùng một quy ước như Java, ưu tiên IPv4 nếu được bật. Trong một số trường hợp, chẳng hạn như khi mạng IPv4
không thể phân giải/truy cập vào các địa chỉ bên ngoài, điều này có thể gây ra các ngoại lệ Network
unreachable và lỗi bản dựng. Trong những trường hợp này, bạn có thể ghi đè
hành vi của Bazel để ưu tiên IPv6 bằng cách sử dụng
java.net.preferIPv6Addresses=true thuộc tính
hệ thống.
Cụ thể:
Sử dụng
--host_jvm_args=-Djava.net.preferIPv6Addresses=truetùy chọn khởi động, chẳng hạn như bằng cách thêm dòng sau vào tệp.bazelrc:startup --host_jvm_args=-Djava.net.preferIPv6Addresses=trueKhi chạy các mục tiêu bản dựng Java cần kết nối với Internet (chẳng hạn như cho các bài kiểm thử tích hợp), hãy sử dụng
--jvmopt=-Djava.net.preferIPv6Addresses=truecờ công cụ. Ví dụ: hãy thêm vào tệp.bazelrc:build --jvmopt=-Djava.net.preferIPv6AddressesNếu bạn đang sử dụng
rules_jvm_externalđể phân giải phiên bản phần phụ thuộc, hãy thêm-Djava.net.preferIPv6Addresses=truevào biến môi trườngCOURSIER_OPTSđể cung cấp các tuỳ chọn JVM cho Coursier.
Bản dựng ngoại tuyến
Đôi khi, bạn có thể muốn chạy bản dựng ngoại tuyến, chẳng hạn như khi đi máy bay. Đối với các trường hợp sử dụng đơn giản như vậy, hãy tìm nạp trước các kho lưu trữ cần thiết bằng bazel fetch hoặc bazel sync. Để tắt tính năng tìm nạp thêm kho lưu trữ trong quá trình tạo bản dựng, hãy sử dụng tuỳ chọn --nofetch.
Đối với các bản dựng ngoại tuyến thực sự, trong đó một thực thể khác cung cấp tất cả các tệp cần thiết, Bazel hỗ trợ tuỳ chọn --distdir. Cờ này yêu cầu Bazel trước tiên tìm trong
các thư mục được chỉ định bởi tuỳ chọn đó khi một quy tắc kho lưu trữ yêu cầu Bazel
tìm nạp một tệp bằng ctx.download hoặc
ctx.download_and_extract. Bằng cách cung cấp tổng băm của tệp cần thiết, Bazel sẽ tìm một tệp khớp với tên cơ sở của URL đầu tiên và sử dụng bản sao cục bộ nếu giá trị băm khớp.
Bản thân Bazel sử dụng kỹ thuật này để khởi động ngoại tuyến từ cấu phần phần mềm
phân phối.
Bazel thực hiện việc này bằng cách thu thập tất cả các phần phụ thuộc bên ngoài cần thiết
trong một
distdir_tar nội bộ.
Bazel cho phép thực thi các lệnh tuỳ ý trong các quy tắc kho lưu trữ mà không biết liệu các lệnh đó có gọi đến mạng hay không, vì vậy, không thể thực thi các bản dựng hoàn toàn ngoại tuyến. Để kiểm thử xem bản dựng có hoạt động chính xác ở chế độ ngoại tuyến hay không, hãy chặn mạng theo cách thủ công (như Bazel thực hiện trong bài kiểm thử khởi động ).