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 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
.
Chẳng hạn như 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 đườ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
cùng với cờ --repo
để chỉ định kho lưu trữ nào
cho nhà cung cấp, dịch vụ đó chấp nhận cả kho lưu trữ chuẩn
name và 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~
cả hai sẽ nhận được rules_cc để cung cấp
<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ả các phần phụ thuộc bên ngoài cần thiết nhằm 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/...
có cấu hình hiện tại.
Nâng cao sẽ thực hiện một lệnh bazel build --nobuild
để phân tích
mẫu mục tiêu, do đó cờ dựng có thể được áp dụng cho lệnh này và
ảnh hưởng đến kết quả.
Tạo mục tiêu khi không có mạng
Với các phần phụ thuộc bên ngoài có sẵn, 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 sẽ có thể kiểm tra trong nguồn được cung cấp và tạo cùng một nhắm mục tiêu ngoại tuyến 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ữ cụ thể bằng cách tìm tệp bổ sung độc lập . trong thư mục nhà cung cấp.
Có hai lệnh, cả hai đều chấp nhận 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 thông tin được cung cấp nguồn cho kho lưu trữ này trong khi chạy lệnh của nhà cung cấp trừ phi bạn bỏ ghim lệnh đó. 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.
- Kho lưu trữ
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
, người dùng phải tắt câu lệnh pin đầu tiên.
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 nghĩa là di chuyển
các tệp và thư mục liên quan vào thư mục nhà cung cấp nhất định và sử dụng
nguồn do nhà cung cấp 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 cập nhật
được ghim trong tệp ADVERTISER.bazel, sau đó Bazel 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 nội dung đó dưới $(bazel info output_base)/external
thay vì thực sự
chạy quy tắc kho lưu trữ. Nếu không, cảnh báo sẽ được in và Bazel sẽ
phương án dự phòng để 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 quá trình phân giải mô-đun Bazel để tìm nạp dữ liệu bên ngoài
Các phần phụ thuộc này có thể yêu cầu truy cập vào các tệp đăng ký thông qua Internet. Người nhận
đạt được bản dựng ngoại tuyến, tất cả các tệp đăng ký được tìm nạp từ các nhà cung cấp Bazel
trong thư mục <vendor_dir>/_registries
.
Đường liên kết tượng trưng của nhà cung cấp
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 khác hoặc . Để đảm bảo đường liên kết tượng trưng hoạt động chính xác, Bazel sử dụng các cách sau để viết lại đườ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
. Công cụ này được làm mới bằng mỗi lệnh Bazel tự động. - Đối với nguồn được cung cấp, hãy viết lại tất cả các liên kết tượng trưng ban đầu trỏ đến một
đường dẫn trong
$(bazel info output_base)/external
sang đường dẫn tương đối trong<vendor_dir>/bazel-external
Ví dụ: nếu 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
Vì <vendor_dir>/bazel-external
được Bazel tạo tự động, nên
bạn nên thêm thông tin này vào .gitignore
hoặc tương đương để tránh phải kiểm tra lại.
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ả khi 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 sẽ bị thay đổi.