Chủ đề nâng cao về phần phụ thuộc bên ngoài

Báo cáo vấn đề Xem nguồn Nightly · 8.4 · 8.3 · 8.2 · 8.1 · 8.0 · 7.6

Phần phụ thuộc che phủ trong WORKSPACE

Nếu 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. Đây là yêu cầu bắt buộc đối với các phần phụ thuộc mà bạn biên dịch và xuất hiện 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ể tạo bản sao của 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 AB đều phụ thuộc vào các phiên bản khác nhau của testrunner. Đưa cả hai vào myproject mà không bị xung đột bằng cách đặt cho chúng những tên riêng biệt 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ể dùng cơ chế này để tham gia vào chương trình kim cương. Ví dụ: nếu AB có cùng một phần phụ thuộc nhưng gọi phần phụ thuộc đó 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, hãy sử dụng cờ --override_repository. 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. Ví dụ: để ghi đè một kho lưu trữ http_archive thành một thư mục cục bộ, nơi bạn có thể dễ dàng thực hiện các thay đổi.
  • Bán hàng. Nếu bạn đang ở trong một môi trường không thể thực hiện các lệnh gọi mạng, hãy ghi đè các quy tắc kho lưu trữ dựa trên mạng để thay vào đó trỏ đến các thư mục cục bộ.

Sử dụng proxy

Bazel lấy địa chỉ proxy từ các biến môi trường HTTPS_PROXYHTTP_PROXY rồi dùng các địa chỉ này để tải tệp HTTPHTTPS 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 các địa chỉ bên ngoài, điều này có thể gây ra các trường hợp 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 thuộc tính hệ thống java.net.preferIPv6Addresses=true. Cụ thể:

  • Sử dụng --host_jvm_args=-Djava.net.preferIPv6Addresses=true lựa 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=true

  • Khi 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 kiểm thử tích hợp), hãy sử dụng --jvmopt=-Djava.net.preferIPv6Addresses=true cờ công cụ. Ví dụ: thêm vào tệp .bazelrc:

    build --jvmopt=-Djava.net.preferIPv6Addresses

  • Nế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=true vào biến môi trường COURSIER_OPTS để cung cấp các lựa 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 ở chế độ ngoại tuyến, chẳng hạn như khi đi máy bay. Đối với những 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 lựa chọn --nofetch.

Đối với các bản dựng thực sự ngoại tuyến, 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ợ lựa chọn --distdir. Cờ này yêu cầu Bazel trước tiên tìm trong các thư mục do lựa chọn đó chỉ định 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 kiế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 hàm 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. Thao tác này được thực hiện 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 cần biết liệu các lệnh đó có gọi đến mạng hay không, do đó không thể thực thi các bản dựng hoàn toàn ngoại tuyến. Để kiểm thử xem một bản dựng có hoạt động chính xác khi không có mạng hay không, hãy chặn mạng theo cách thủ công (như Bazel thực hiện trong kiểm thử khởi động).