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. Tính năng này 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 cờ 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à đường dẫn tương đối đến thư mục gốc của không gian làm việc hoặc đườ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ữ cần cung cấp. Lệnh này chấp nhận cả tên kho lưu trữ chính tắc và tên kho lưu trữ hiển thị.
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ẽ cung cấp rules_cc trong
<workspace root>/vendor_src/rules_cc~.
Cung cấp các phần phụ thuộc bên ngoài cho các mục tiêu nhất định
Để cung cấp tất cả các phần phụ thuộc bên ngoài cần thiết cho việc tạo 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/... với cấu hình hiện tại.
Về cơ bản, 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ác 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
Khi 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 sẽ 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 vào mạng và bộ nhớ đệm kho lưu trữ.
Do đó, bạn có thể kiểm tra nguồn được cung cấp và tạo các mục tiêu tương tự ngoại tuyến trên một máy khác.
Cung cấp tất cả cá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ả cá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 một 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 cân nhắc việc cung cấp cho các mục tiêu cụ thể.
Định cấu hình chế độ nhà cung cấp bằng VENDOR.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 VENDOR.bazel nằm trong thư mục nhà cung cấp.
Có 2 chỉ thị có sẵn, cả hai đều chấp nhận danh sách tên kho lưu trữ chính tắc làm đối số:
ignore(): để hoàn toàn bỏ qua một kho lưu trữ khỏi 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 như thể có cờ--override_repositorycho kho lưu trữ này. Bazel sẽ KHÔNG cập nhật nguồn được cung cấp cho kho lưu trữ này trong khi chạy lệnh nhà cung cấp, trừ phi kho lưu trữ này đượ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~")
Với cấu hình này
- Cả hai kho lưu trữ sẽ bị loại trừ khỏi các lệnh nhà cung cấp tiếp theo.
- Kho lưu trữ
bazel_skylibsẽ 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 được cung cấp của
bazel_skylibmột cách an toàn. - Để cung cấp lại
bazel_skylib, trước tiên, người dùng phải tắt câu lệnh ghim.
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 ra
các tệp và thư mục có liên quan đến thư mục nhà cung cấp đã cho và 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 đánh dấu được cung cấp là mới nhất hoặc kho lưu trữ được
ghim trong tệp VENDOR.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 nguồn đó 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ữ.
Cung cấp tệp đăng ký
Bazel phải thực hiện quá trình phân giải mô-đun Bazel để tìm nạp các phần phụ thuộc bên ngoài
. Quá trình này có thể yêu cầu truy cập vào các tệp đăng ký thông qua Internet. Để
tạo bản dựng ngoại tuyến, Bazel sẽ cung cấp tất cả các tệp đăng ký được tìm nạp từ
mạng trong thư mục <vendor_dir>/_registries.
Cung cấp đường liên kết tượng trưng
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 đây để 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-externaltrỏ đến$(bazel info output_base)/external. Đường liên kết này sẽ tự động được làm mới bởi mọi lệnh Bazel. - Đối với nguồn được cung cấp, hãy viết 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)/externalthà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
Đường liên kết 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
Vì <vendor_dir>/bazel-external được Bazel tự động tạo, nên bạn nên thêm đường liên kết này vào .gitignore hoặc tương đương để tránh kiểm tra đường liên kết 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 bazel bị thay đổi.