Chế độ nhà cung cấp

Báo cáo vấn đề Xem nguồn Nightly · 7.4 . 7.3 · 7.2 · 7.1 · 7.0 · 6.5

Chế độ nhà cung cấp là một tính năng của Bzlmod cho phép bạn tạo bản sao cục bộ của các phần phụ thuộc bên ngoài. Điều này rất hữu ích cho các bản dựng ngoại tuyến hoặc khi bạn muốn kiểm soát nguồn của một phần phụ thuộc bên ngoài.

Bật chế độ nhà cung cấp

Bạn có thể bật chế độ nhà cung cấp bằng cách chỉ định cờ --vendor_dir.

Ví dụ: bằng cách thêm thành phần này vào tệp .bazelrc:

# Enable vendor mode with vendor directory under <workspace>/vendor_src
common --vendor_dir=vendor_src

Thư mục nhà cung cấp có thể là một đường dẫn tương đối đến thư mục gốc của không gian làm việc hoặc một đường dẫn tuyệt đối.

Cung cấp một kho lưu trữ bên ngoài cụ thể

Bạn có thể sử dụng lệnh vendor với cờ --repo để chỉ định kho lưu trữ nào cho nhà cung cấp. Lệnh này chấp nhận cả tên kho lưu trữ chuẩntên kho lưu trữ rõ ràng.

Ví dụ: chạy:

bazel vendor --vendor_dir=vendor_src --repo=@rules_cc

hoặc

bazel vendor --vendor_dir=vendor_src --repo=@@rules_cc~

sẽ đều nhận được rules_cc được cung cấp trong <workspace root>/vendor_src/rules_cc~.

Các phần phụ thuộc bên ngoài của nhà cung cấp cho các mục tiêu nhất định

Để cung cấp tất cả phần phụ thuộc bên ngoài cần thiết cho việc xây dựng các mẫu mục tiêu nhất định, bạn có thể chạy bazel vendor <target patterns>.

Ví dụ

bazel vendor --vendor_dir=vendor_src //src/main:hello-world //src/test/...

sẽ cung cấp tất cả các kho lưu trữ cần thiết để tạo mục tiêu //src/main:hello-world và tất cả các mục tiêu trong //src/test/... bằng cấu hình hiện tại.

Trong phần nội dung, lệnh này đang thực hiện lệnh bazel build --nobuild để phân tích các mẫu mục tiêu, do đó, bạn có thể áp dụng cờ bản dựng cho lệnh này và ảnh hưởng đến kết quả.

Tạo mục tiêu ngoại tuyến

Với các phần phụ thuộc bên ngoài được cung cấp, bạn có thể tạo mục tiêu ngoại tuyến bằng cách

bazel build --vendor_dir=vendor_src //src/main:hello-world //src/test/...

Bản dựng phải hoạt động trong một môi trường bản dựng sạch mà không có quyền truy cập mạng và bộ nhớ đệm của kho lưu trữ.

Do đó, bạn có thể kiểm tra nguồn của nhà cung cấp và tạo các mục tiêu tương tự khi không có mạng trên một máy khác.

Nhà cung cấp tất cả phần phụ thuộc bên ngoài

Để cung cấp tất cả các kho lưu trữ trong biểu đồ phần phụ thuộc bên ngoài bắc cầu, bạn có thể chạy:

bazel vendor --vendor_dir=vendor_src

Xin lưu ý rằng việc cung cấp tất cả phần phụ thuộc có một số nhược điểm:

  • Việc tìm nạp tất cả các kho lưu trữ (bao gồm cả những kho lưu trữ được giới thiệu theo cách bắc cầu) có thể tốn thời gian.
  • Thư mục nhà cung cấp có thể trở nên rất lớn.
  • Một số kho lưu trữ có thể không tìm nạp được nếu không tương thích với nền tảng hoặc môi trường hiện tại.

Do đó, trước tiên hãy xem xét việc cung cấp dịch vụ cho các mục tiêu cụ thể.

Định cấu hình chế độ nhà cung cấp bằng Ask.bazel

Bạn có thể kiểm soát cách xử lý các kho lưu trữ nhất định bằng tệp Đưa ra trong thư mục nhà cung cấp.

Có 2 lệnh, cả 2 lệnh đều chấp nhận một danh sách tên kho lưu trữ chuẩn làm đối số:

  • ignore(): để bỏ qua hoàn toàn kho lưu trữ từ chế độ nhà cung cấp.
  • pin(): để ghim một kho lưu trữ vào nguồn được cung cấp hiện tại của nó như thể có một cờ --override_repository cho kho lưu trữ này. Bazel sẽ KHÔNG cập nhật nguồn do nhà cung cấp cung cấp cho kho lưu trữ này trong khi chạy lệnh của nhà cung cấp, trừ phi kho lưu trữ đó được bỏ ghim. Người dùng có thể sửa đổi và duy trì nguồn được cung cấp cho kho lưu trữ này theo cách thủ công.

Ví dụ

ignore("@@rules_cc~")
pin("@@bazel_skylib~")

Có cấu hình này

  • Cả hai kho lưu trữ này sẽ bị loại trừ khỏi các lệnh tiếp theo của nhà cung cấp.
  • Repo bazel_skylib sẽ bị ghi đè thành nguồn nằm trong thư mục nhà cung cấp.
  • Người dùng có thể sửa đổi nguồn do bazel_skylib cung cấp một cách an toàn.
  • Để tạo lại bazel_skylib, trước tiên, người dùng phải tắt câu lệnh pin.

Tìm hiểu cách hoạt động của chế độ nhà cung cấp

Bazel tìm nạp các phần phụ thuộc bên ngoài của một dự án trong $(bazel info output_base)/external. Việc cung cấp các phần phụ thuộc bên ngoài có nghĩa là di chuyển các tệp và thư mục có liên quan sang thư mục nhà cung cấp nhất định, đồng thời sử dụng nguồn được cung cấp cho các bản dựng sau này.

Nội dung được cung cấp bao gồm:

  • Thư mục kho lưu trữ
  • Tệp đánh dấu kho lưu trữ

Trong quá trình tạo bản dựng, nếu tệp điểm đánh dấu được cung cấp đã được cập nhật hoặc kho lưu trữ được ghim trong tệp Ask.bazel, thì Bazel sẽ sử dụng nguồn được cung cấp bằng cách tạo một đường liên kết tượng trưng đến tệp đó trong $(bazel info output_base)/external thay vì thực sự chạy quy tắc kho lưu trữ. Nếu không, một cảnh báo sẽ được in và Bazel sẽ quay lại tìm nạp phiên bản mới nhất của kho lưu trữ.

Tệp đăng ký của nhà cung cấp

Bazel phải thực hiện độ phân giải mô-đun Bazel để tìm nạp các phần phụ thuộc bên ngoài. Điều này có thể yêu cầu truy cập vào các tệp đăng ký thông qua Internet. Để đạt được bản dựng ngoại tuyến, Bazel cung cấp tất cả các tệp đăng ký đã tìm nạp từ mạng trong thư mục <vendor_dir>/_registries.

Các kho lưu trữ bên ngoài có thể chứa các đường liên kết tượng trưng trỏ đến các tệp hoặc thư mục khác. Để đảm bảo các đường liên kết tượng trưng hoạt động chính xác, Bazel sử dụng chiến lược sau để viết lại các đường liên kết tượng trưng trong nguồn được cung cấp:

  • Tạo một đường liên kết tượng trưng <vendor_dir>/bazel-external trỏ đến $(bazel info output_base)/external. Tệp này được làm mới tự động bằng mọi lệnh Bazel.
  • Đối với nguồn của nhà cung cấp, hãy ghi lại tất cả các đường liên kết tượng trưng ban đầu trỏ đến một đường dẫn trong $(bazel info output_base)/external thành một đường dẫn tương đối trong <vendor_dir>/bazel-external.

Ví dụ: nếu đường liên kết tượng trưng ban đầu là

<vendor_dir>/repo_foo~/link  =>  $(bazel info output_base)/external/repo_bar~/file

Mã này sẽ được viết lại thành

<vendor_dir>/repo_foo~/link  =>  ../../bazel-external/repo_bar~/file

trong đó

<vendor_dir>/bazel-external  =>  $(bazel info output_base)/external  # This might be new if output base is changed

<vendor_dir>/bazel-external được Bazel tạo tự động, nên bạn nên thêm tệp này vào .gitignore hoặc tương đương để tránh kiểm tra tệp này.

Với chiến lược này, các đường liên kết tượng trưng trong nguồn được cung cấp sẽ hoạt động chính xác ngay cả sau khi nguồn được cung cấp được di chuyển đến một vị trí khác hoặc cơ sở đầu ra của bazel thay đổi.