Các phần trước đã mô tả tóm tắt về các gói, mục tiêu và nhãn, cũng như biểu đồ phần phụ thuộc của bản dựng. Phần này mô tả cú pháp cụ thể dùng để xác định gói.
Theo định nghĩa, mỗi gói đều chứa một tệp BUILD
. Tệp này là một chương trình ngắn. Các tệp BUILD
được đánh giá bằng ngôn ngữ bắt buộc là Starlark.
Chúng được hiểu là một danh sách tuần tự các câu lệnh.
Nhìn chung, thứ tự rất quan trọng: chẳng hạn như phải xác định biến trước khi sử dụng. Tuy nhiên, hầu hết các tệp BUILD
chỉ bao gồm nội dung khai báo của các quy tắc bản dựng và thứ tự tương đối của các câu lệnh này là không quan trọng; tất cả điều quan trọng là quy tắc loại được khai báo và giá trị nào được khai báo theo thời điểm đánh giá gói hoàn tất.
Khi một hàm quy tắc bản dựng, chẳng hạn như cc_library
, được thực thi, hàm này sẽ tạo một mục tiêu mới trong biểu đồ. Mục tiêu này có thể được tham chiếu bằng nhãn sau đó.
Trong các tệp BUILD
đơn giản, bạn có thể tự do sắp xếp lại các nội dung khai báo quy tắc mà không cần thay đổi hành vi.
Để khuyến khích sự phân tách rõ ràng giữa mã và dữ liệu, tệp BUILD
không được chứa định nghĩa hàm, câu lệnh for
hoặc câu lệnh if
(nhưng cho phép hiểu nội dung danh sách và biểu thức if
). Bạn có thể khai báo các hàm trong tệp .bzl
. Ngoài ra, bạn không được phép sử dụng các đối số *args
và **kwargs
trong tệp BUILD
; thay vào đó, hãy liệt kê tất cả các đối số một cách rõ ràng.
Điều quan trọng là các chương trình trong Starlark không thể thực hiện I/O tuỳ ý. Sự bất biến này khiến việc diễn giải các tệp BUILD
mang tính khép kín – chỉ phụ thuộc vào tập hợp đầu vào đã biết. Điều này rất cần thiết để đảm bảo rằng các bản dựng có thể tái tạo.
Để biết thêm chi tiết, hãy xem nội dung về Độ mạnh.
Bạn chỉ nên viết tệp BUILD
bằng các ký tự ASCII, mặc dù về mặt kỹ thuật, các tệp này được diễn giải bằng bộ ký tự Latinh-1.
Vì các tệp BUILD
cần được cập nhật mỗi khi các phần phụ thuộc của mã cơ bản thay đổi, nên các tệp này thường do nhiều người trong một nhóm duy trì. Tác giả tệp BUILD
nên thoải mái nhận xét để ghi nhận vai trò của từng mục tiêu bản dựng, cho dù mục tiêu đó có nhằm mục đích sử dụng công khai hay không và để ghi lại vai trò của chính gói đó.
Đang tải một tiện ích
Phần mở rộng Bazel là các tệp có đuôi là .bzl
. Sử dụng câu lệnh load
để nhập biểu tượng từ tiện ích.
load("//foo/bar:file.bzl", "some_library")
Mã này tải tệp foo/bar/file.bzl
và thêm biểu tượng some_library
vào môi trường. Hàm này có thể được dùng để tải các quy tắc, hàm hoặc hằng số mới (ví dụ: một chuỗi hoặc danh sách). Bạn có thể nhập nhiều biểu tượng bằng cách sử dụng các đối số bổ sung cho lệnh gọi đến load
. Đối số phải là giá trị cố định kiểu chuỗi (không có biến) và câu lệnh load
phải xuất hiện ở cấp cao nhất – không được nằm trong nội dung hàm.
Đối số đầu tiên của load
là một nhãn xác định tệp .bzl
. Nếu đó là nhãn tương đối, thì nhãn này sẽ được phân giải đối với gói (không phải thư mục) chứa tệp bzl
hiện tại. Nhãn tương đối trong câu lệnh load
phải sử dụng :
đứng đầu.
load
cũng hỗ trợ các bí danh, do đó, bạn có thể chỉ định nhiều tên cho các biểu tượng đã nhập.
load("//foo/bar:file.bzl", library_alias = "some_library")
Bạn có thể xác định nhiều biệt hiệu trong một câu lệnh load
. Hơn nữa, danh sách đối số có thể chứa cả bí danh và tên biểu tượng thông thường. Ví dụ sau đây là hoàn toàn hợp pháp (xin lưu ý khi nào nên sử dụng dấu ngoặc kép).
load(":my_rules.bzl", "some_rule", nice_alias = "some_other_rule")
Trong tệp .bzl
, các biểu tượng bắt đầu bằng _
không được xuất và không thể tải được từ tệp khác.
Bạn có thể sử dụng chế độ hiển thị tải để hạn chế
người có thể tải tệp .bzl
.
Các loại quy tắc tạo bản dựng
Phần lớn các quy tắc xây dựng đều thuộc các nhóm gia đình, được nhóm lại với nhau theo ngôn ngữ. Ví dụ: cc_binary
, cc_library
và cc_test
lần lượt là các quy tắc xây dựng cho tệp nhị phân C++, thư viện và hoạt động kiểm thử. Các ngôn ngữ khác sử dụng cùng một lược đồ đặt tên với một tiền tố khác, chẳng hạn như java_*
cho Java. Một số hàm trong số này được ghi lại trong Xây dựng bách khoa toàn thư, nhưng ai cũng có thể tạo các quy tắc mới.
Các quy tắc
*_binary
xây dựng các chương trình có thể thực thi bằng một ngôn ngữ nhất định. Sau khi tạo bản dựng, tệp thực thi sẽ nằm trong cây đầu ra nhị phân của công cụ xây dựng tại tên tương ứng cho nhãn của quy tắc, vì vậy,//my:program
sẽ xuất hiện ở$(BINDIR)/my/program
(chẳng hạn).Ở một số ngôn ngữ, các quy tắc đó cũng tạo thư mục runfiles chứa tất cả tệp được đề cập trong thuộc tính
data
thuộc quy tắc đó hoặc bất kỳ quy tắc nào trong việc đóng phần phụ thuộc bắc cầu; tập hợp các tệp này được tập hợp ở cùng một nơi để dễ dàng triển khai cho quá trình sản xuất.Quy tắc
*_test
là đặc điểm của quy tắc*_binary
, dùng để kiểm thử tự động. Kiểm thử đơn giản là những chương trình trả về 0 khi thành công.Giống như tệp nhị phân, hoạt động kiểm thử cũng có cây runfile và các tệp bên dưới là những tệp duy nhất mà bài kiểm thử có thể mở hợp pháp trong thời gian chạy. Ví dụ: chương trình
cc_test(name='x', data=['//foo:bar'])
có thể mở và đọc$TEST_SRCDIR/workspace/foo/bar
trong quá trình thực thi. (Mỗi ngôn ngữ lập trình có hàm hiệu dụng riêng để truy cập giá trị của$TEST_SRCDIR
, nhưng tất cả đều tương đương với việc sử dụng trực tiếp biến môi trường.) Nếu không tuân thủ quy tắc này, quá trình kiểm thử sẽ không thành công khi thực thi trên máy chủ kiểm thử từ xa.Các quy tắc
*_library
chỉ định các mô-đun được biên dịch riêng bằng ngôn ngữ lập trình đã cho. Các thư viện có thể phụ thuộc vào các thư viện khác, còn tệp nhị phân và hoạt động kiểm thử có thể phụ thuộc vào thư viện, với hành vi biên dịch riêng biệt dự kiến.
Nhãn | Phần phụ thuộc |