Trang này trình bày cách xác định quy tắc kho lưu trữ và cung cấp các ví dụ để biết thêm thông tin chi tiết.
Kho lưu trữ bên ngoài là một cây thư mục,
chứa các tệp nguồn có thể dùng trong bản dựng Bazel. Kho lưu trữ này được tạo theo yêu cầu bằng cách
chạy quy tắc kho lưu trữ tương ứng. Bạn có thể xác định kho lưu trữ theo nhiều
cách, nhưng cuối cùng, mỗi kho lưu trữ được xác định bằng cách gọi một quy tắc kho lưu trữ, giống như
mục tiêu bản dựng được xác định bằng cách gọi các quy tắc bản dựng. Bạn có thể dùng các kho lưu trữ này để phụ thuộc vào
thư viện của bên thứ ba (chẳng hạn như thư viện được đóng gói Maven), nhưng cũng có thể dùng để tạo các tệp
BUILD dành riêng cho máy chủ mà Bazel đang chạy.
Định nghĩa quy tắc kho lưu trữ
Trong tệp .bzl, hãy sử dụng hàm
repository_rule để xác định một quy tắc kho lưu trữ mới và lưu trữ quy tắc đó trong một biến toàn cục. Sau khi xác định, bạn có thể gọi quy tắc kho lưu trữ dưới dạng một hàm để xác định kho lưu trữ. Thao tác gọi này thường được
thực hiện từ bên trong hàm triển khai tiện ích mô-đun.
Hai thành phần chính của định nghĩa quy tắc kho lưu trữ là lược đồ thuộc tính và hàm triển khai. Lược đồ thuộc tính xác định tên và loại thuộc tính được truyền đến lệnh gọi quy tắc kho lưu trữ, đồng thời hàm triển khai được chạy khi cần tìm nạp kho lưu trữ.
Thuộc tính
Thuộc tính là các đối số được truyền đến lệnh gọi quy tắc kho lưu trữ. Lược đồ thuộc tính được quy tắc kho lưu trữ chấp nhận được chỉ định bằng đối số attrs khi quy tắc kho lưu trữ được xác định bằng lệnh gọi đến repository_rule. Ví dụ về việc xác định
url và sha256 thuộc tính dưới dạng chuỗi:
http_archive = repository_rule(
implementation=_impl,
attrs={
"url": attr.string(mandatory=True),
"sha256": attr.string(mandatory=True),
}
)
Để truy cập vào một thuộc tính trong hàm triển khai, hãy sử dụng
repository_ctx.attr.<attribute_name>:
def _impl(repository_ctx):
url = repository_ctx.attr.url
checksum = repository_ctx.attr.sha256
Tất cả repository_rule đều có thuộc tính name được xác định ngầm. Đây là một
thuộc tính chuỗi hoạt động một cách kỳ diệu: khi được chỉ định là giá trị đầu vào cho
lệnh gọi quy tắc kho lưu trữ, thuộc tính này sẽ lấy tên kho lưu trữ rõ ràng; nhưng khi được đọc từ
hàm triển khai của quy tắc kho lưu trữ bằng cách sử dụng repository_ctx.attr.name, thuộc tính này sẽ trả về
tên kho lưu trữ chính tắc.
Hàm triển khai
Mọi quy tắc kho lưu trữ đều yêu cầu một hàm implementation. Hàm này chứa logic thực tế của quy tắc và được thực thi nghiêm ngặt trong Giai đoạn tải.
Hàm này có chính xác một tham số đầu vào là repository_ctx. Hàm này
trả về None để biểu thị rằng quy tắc có thể tái tạo được dựa trên các
tham số đã chỉ định hoặc một từ điển có một tập hợp tham số cho quy tắc đó, giúp biến quy tắc đó thành một quy tắc có thể tái tạo tạo ra cùng một kho lưu trữ. Ví dụ: đối với một quy tắc theo dõi kho lưu trữ git, điều đó có nghĩa là trả về một
mã nhận dạng cam kết cụ thể thay vì một nhánh nổi ban đầu
được chỉ định.
Bạn có thể sử dụng tham số đầu vào repository_ctx để truy cập vào các giá trị thuộc tính và
các hàm không khép kín (tìm tệp nhị phân, thực thi tệp nhị phân, tạo tệp trong
kho lưu trữ hoặc tải tệp xuống từ Internet). Hãy xem tài liệu về API
để biết thêm thông tin. Ví dụ:
def _impl(repository_ctx):
repository_ctx.symlink(repository_ctx.attr.path, "")
local_repository = repository_rule(
implementation=_impl,
...)
Khi nào hàm triển khai được thực thi?
Hàm triển khai của một quy tắc kho lưu trữ được thực thi khi Bazel cần một mục tiêu từ kho lưu trữ đó, chẳng hạn như khi một mục tiêu khác (trong một kho lưu trữ khác) phụ thuộc vào mục tiêu đó hoặc nếu mục tiêu đó được đề cập trên dòng lệnh. Sau đó, hàm triển khai sẽ tạo kho lưu trữ trong hệ thống tệp. Đây được gọi là "tìm nạp" kho lưu trữ.
Ngược lại với các mục tiêu thông thường, kho lưu trữ không nhất thiết phải được tìm nạp lại khi có thay đổi khiến kho lưu trữ trở nên khác biệt. Lý do là vì có những thứ mà Bazel không thể phát hiện các thay đổi hoặc sẽ gây ra quá nhiều chi phí cho mỗi bản dựng (ví dụ: những thứ được tìm nạp từ mạng). Do đó, kho lưu trữ chỉ được tìm nạp lại nếu một trong những điều sau đây thay đổi:
- Các thuộc tính được truyền đến lệnh gọi quy tắc kho lưu trữ.
- Mã Starlark bao gồm việc triển khai quy tắc kho lưu trữ.
- Giá trị của bất kỳ biến môi trường nào được truyền đến
repository_ctx'sgetenv()phương thức hoặc được khai báo bằng thuộc tínhenvironcủarepository_rule. Bạn có thể kết nối cứng các giá trị của các biến môi trường này trên dòng lệnh bằng cờ--repo_env. - Sự tồn tại, nội dung và loại của bất kỳ đường dẫn nào đang được
watched trong hàm triển khai của quy tắc kho lưu trữ.- Một số phương thức khác của
repository_ctxcó tham sốwatch, chẳng hạn nhưread(),execute(), vàextract(), cũng có thể khiến các đường dẫn được theo dõi. - Tương tự,
repository_ctx.watch_treevàpath.readdircó thể khiến các đường dẫn được theo dõi theo những cách khác.
- Một số phương thức khác của
- Khi
bazel fetch --forceđược thực thi.
Có 2 tham số của repository_rule kiểm soát thời điểm các kho lưu trữ
được tìm nạp lại:
- Nếu cờ
configuređược đặt, kho lưu trữ sẽ được tìm nạp lại trênbazel fetch --force --configure(các kho lưu trữ không phảiconfiguresẽ không được tìm nạp lại). - Nếu cờ
localđược đặt, ngoài các trường hợp nêu trên, kho lưu trữ cũng được tìm nạp lại khi máy chủ Bazel khởi động lại.
Buộc tìm nạp lại kho lưu trữ bên ngoài
Đôi khi, một kho lưu trữ bên ngoài có thể trở nên lỗi thời mà không có bất kỳ thay đổi nào đối với
định nghĩa hoặc phần phụ thuộc của kho lưu trữ đó. Ví dụ: một kho lưu trữ tìm nạp nguồn có thể tuân theo a
nhánh cụ thể của kho lưu trữ bên thứ ba và các cam kết mới có sẵn trên
nhánh đó. Trong trường hợp này, bạn có thể yêu cầu bazel tìm nạp lại tất cả các kho lưu trữ bên ngoài
vô điều kiện bằng cách gọi bazel fetch --force --all.
Hơn nữa, một số quy tắc kho lưu trữ kiểm tra máy cục bộ và có thể trở nên lỗi thời nếu
máy cục bộ được nâng cấp. Tại đây, bạn có thể yêu cầu Bazel chỉ tìm nạp lại những
kho lưu trữ bên ngoài mà repository_rule
định nghĩa có thuộc tính configure được đặt, hãy sử dụng bazel fetch --force
--configure.
Ví dụ
Chuỗi công cụ tự động định cấu hình C++: sử dụng quy tắc kho lưu trữ để tự động tạo các tệp cấu hình C++ cho Bazel bằng cách tìm trình biên dịch C++ cục bộ, môi trường và các cờ mà trình biên dịch C++ hỗ trợ.
Kho lưu trữ Go sử dụng một số
repository_ruleđể xác định danh sách các phần phụ thuộc cần thiết để sử dụng các quy tắc Go.rules_jvm_external tạo một kho lưu trữ bên ngoài có tên là
@maventheo mặc định, tạo các mục tiêu bản dựng cho mọi cấu phần phần mềm Maven trong cây phần phụ thuộc bắc cầu.