Trang này mô tả cách mở rộng ngôn ngữ BUILD bằng cách sử dụng các macro và quy tắc.
Tiện ích Bazel là những tệp có đuôi .bzl
. Sử dụng câu lệnh tải để nhập một biểu tượng từ một tiện ích.
Trước khi tìm hiểu các khái niệm nâng cao hơn, trước tiên, bạn cần:
Đọc về ngôn ngữ Starlark, được dùng trong cả tệp
BUILD
và.bzl
.Tìm hiểu cách bạn có thể chia sẻ các biến giữa hai tệp
BUILD
.
Macro và quy tắc
Macro là một hàm tạo ra các quy tắc. Macro có hai loại: macro tượng trưng (mới trong Bazel 8) và macro cũ. Hai loại macro này được xác định theo cách khác nhau, nhưng hoạt động gần như giống nhau theo quan điểm của người dùng. Macro rất hữu ích khi tệp BUILD
trở nên quá lặp lại hoặc quá phức tạp, vì macro cho phép bạn sử dụng lại một số mã. Hàm này được đánh giá ngay khi tệp BUILD
được đọc. Sau khi đánh giá tệp BUILD
, Bazel có rất ít thông tin về macro. Nếu macro của bạn tạo ra một genrule
, thì Bazel sẽ hoạt động gần như thể hiện rằng bạn đã khai báo genrule
trong tệp BUILD
. (Một trường hợp ngoại lệ là các mục tiêu được khai báo trong một macro tượng trưng có ngữ nghĩa hiển thị đặc biệt: một macro tượng trưng có thể ẩn các mục tiêu nội bộ của nó khỏi phần còn lại của gói.)
Quy tắc mạnh hơn macro. Nó có thể truy cập vào các thành phần bên trong của Bazel và có toàn quyền kiểm soát những gì đang diễn ra. Ví dụ: quy tắc này có thể truyền thông tin cho các quy tắc khác.
Nếu muốn sử dụng lại logic đơn giản, hãy bắt đầu bằng một macro; bạn nên dùng macro tượng trưng, trừ phi bạn cần hỗ trợ các phiên bản Bazel cũ. Nếu một macro trở nên phức tạp, bạn nên chuyển macro đó thành một quy tắc. Việc hỗ trợ một ngôn ngữ mới thường được thực hiện bằng một quy tắc. Quy tắc dành cho người dùng nâng cao và hầu hết người dùng sẽ không bao giờ phải viết quy tắc; họ sẽ chỉ tải và gọi các quy tắc hiện có.
Mô hình đánh giá
Một bản dựng bao gồm 3 giai đoạn.
Giai đoạn tải. Trước tiên, hãy tải và đánh giá tất cả các tiện ích cũng như tất cả các tệp
BUILD
cần thiết cho bản dựng. Việc thực thi các tệpBUILD
chỉ đơn giản là tạo thực thể cho các quy tắc (mỗi khi một quy tắc được gọi, quy tắc đó sẽ được thêm vào một biểu đồ). Đây là nơi các macro được đánh giá.Giai đoạn phân tích. Mã của các quy tắc được thực thi (hàm
implementation
của chúng) và các hành động được khởi tạo. Hành động mô tả cách tạo một tập hợp đầu ra từ một tập hợp đầu vào, chẳng hạn như "chạy gcc trên hello.c và nhận hello.o". Bạn phải liệt kê rõ ràng những tệp sẽ được tạo trước khi thực thi các lệnh thực tế. Nói cách khác, giai đoạn phân tích sẽ lấy biểu đồ do giai đoạn tải tạo ra và tạo biểu đồ hành động.Giai đoạn thực thi. Các thao tác sẽ được thực thi khi bạn cần ít nhất một trong các đầu ra của thao tác. Nếu thiếu tệp hoặc nếu một lệnh không tạo được đầu ra, thì bản dựng sẽ không thành công. Các quy trình kiểm thử cũng được chạy trong giai đoạn này.
Bazel sử dụng tính song song để đọc, phân tích cú pháp và đánh giá các tệp .bzl
và tệp BUILD
. Mỗi bản dựng sẽ đọc một tệp tối đa một lần và kết quả đánh giá sẽ được lưu vào bộ nhớ đệm và sử dụng lại. Một tệp chỉ được đánh giá một lần sau khi tất cả các phần phụ thuộc của tệp (câu lệnh load()
) được phân giải. Theo thiết kế, việc tải một tệp .bzl
không có tác dụng phụ rõ ràng, tệp này chỉ xác định các giá trị và hàm.
Bazel cố gắng thông minh: Bazel sử dụng tính năng phân tích phần phụ thuộc để biết những tệp nào phải được tải, những quy tắc nào phải được phân tích và những thao tác nào phải được thực thi. Ví dụ: nếu một quy tắc tạo ra những thao tác mà bạn không cần cho bản dựng hiện tại, thì những thao tác đó sẽ không được thực thi.
Tạo phần mở rộng
Tạo macro đầu tiên để sử dụng lại một số mã. Sau đó, hãy tìm hiểu thêm về macro và cách sử dụng macro để tạo "động từ tuỳ chỉnh".
Làm theo hướng dẫn về quy tắc để bắt đầu sử dụng quy tắc. Tiếp theo, bạn có thể đọc thêm về các khái niệm về quy tắc.
Hai đường liên kết bên dưới sẽ rất hữu ích khi bạn viết các tiện ích của riêng mình. Để chúng trong tầm tay:
Vươn xa hơn
Ngoài macro và quy tắc, bạn có thể muốn viết khía cạnh và quy tắc kho lưu trữ.
Sử dụng Buildifier một cách nhất quán để định dạng và kiểm tra mã của bạn.
Tuân thủ
.bzl
hướng dẫn về phong cách.Kiểm thử mã của bạn.
Tạo tài liệu để trợ giúp người dùng.
Tối ưu hoá hiệu suất của mã.
Triển khai các tiện ích của bạn cho người khác.