Trang này mô tả cách mở rộng ngôn ngữ BUILD bằng macro và quy tắc.
Đuôi Bazel là các tệp có đuôi là .bzl
. Sử dụng
câu lệnh tải để nhập biểu tượng từ tiện ích.
Trước khi tìm hiểu các khái niệm nâng cao hơn, đầu tiên:
Đọc về ngôn ngữ Starlark, được sử dụng trong cả Tệp
BUILD
và.bzl
.Tìm hiểu cách bạn có thể chia sẻ biến giữa 2 tệp
BUILD
.
Macro và quy tắc
Macro là một hàm tạo thực thể cho các quy tắc. Sẽ rất hữu ích khi
Tệp BUILD
đang trở nên quá lặp lại hoặc quá phức tạp, vì cho phép bạn sử dụng lại
mã nào đó. Hàm này được đánh giá ngay khi tệp BUILD
được đọc. Sau
trong việc đánh giá tệp BUILD
, Bazel có ít thông tin về macro:
nếu macro của bạn tạo genrule
, Bazel sẽ hoạt động như thể bạn đã viết
genrule
. Do đó, bazel query
sẽ chỉ liệt kê genrule
đã tạo.
Quy tắc mạnh hơn macro. Ứng dụng này có thể truy cập vào Bazel nội bộ và có toàn quyền kiểm soát những gì đang diễn ra. Ví dụ: bạn có thể đạt sang các quy tắc khác.
Nếu bạn muốn sử dụng lại logic đơn giản, hãy bắt đầu bằng macro. Nếu macro trở thành phức tạp, bạn nên biến quy tắc thành quy tắc. Hỗ trợ một ngôn ngữ mới thường được thực hiện với một quy tắc. Quy tắc dành cho người dùng nâng cao và người dùng sẽ không bao giờ phải viết mã; chúng sẽ chỉ tải và gọi báo cáo hiện có quy tắ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ả
BUILD
các tệp cần thiết cho bản dựng. Việc thực thi các tệpBUILD
chỉ đơn giản tạo thực thể cho các quy tắc (mỗi lần một quy tắc được gọi, quy tắc này sẽ được thêm vào biểu đồ). Đây là nơi macro được đánh giá.Giai đoạn phân tích. Mã của các quy tắc được thực thi (
implementation
của các quy tắc) hàm) và các hành động được tạo thực thể. Một thao tác 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 nào sẽ được tạo trước đó 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 một biểu đồ hành động.Giai đoạn thực thi. Các thao tác sẽ được thực thi khi có ít nhất một trong các kết quả của các thao tác đó được là bắt buộc. Nếu thiếu tệp hoặc nếu một lệnh không tạo được một kết quả, bản dựng không thành công. Các bài kiểm thử cũng sẽ được chạy trong giai đoạn này.
Bazel sử dụng tính năng song song để đọc, phân tích cú pháp và đánh giá các tệp .bzl
và BUILD
tệp. Tệp được đọc tối đa một lần cho mỗi bản dựng và kết quả đánh giá là
được lưu vào bộ nhớ đệm và sử dụng lại. Tệp chỉ được đánh giá khi tất cả các phần phụ thuộc của tệp đó (load()
tuyên bố) đã được giải quyết. Theo thiết kế, việc tải tệp .bzl
không hiển thị
hiệu ứng phụ, nó chỉ xác định các giá trị và hàm.
Bazel cố gắng khéo léo: sử dụng bản phân tích phần phụ thuộc để biết tệp nào phải cần tải, quy tắc nào phải được phân tích và hành động nào phải được thực thi. Để ví dụ: nếu một quy tắc tạo ra các thao tác mà bạn không cần cho bản dựng hiện tại, thì chúng sẽ không được thực thi.
Tạo phần mở rộng
Tạo macro đầu tiên của bạn để sử dụng lại mã nào đó. Sau đó, tìm hiểu thêm về macro và bằng cách sử dụng chúng để tạo "động từ tuỳ chỉnh".
Làm theo hướng dẫn về quy tắc để làm quen với các quy tắc. Tiếp theo, bạn có thể đọc thêm về khái niệm quy tắc.
Hai đường liên kết dưới đây sẽ rất hữu ích khi bạn tự viết phần mở rộng. Giữ lại ngay trong tầm tay:
Tìm hiểu thêm
Ngoài macro và quy tắc, bạn có thể cần viết phương diện và quy tắc kho lưu trữ.
Sử dụng Buildifier một cách nhất quán để định dạng và tìm lỗi mã nguồn cho mã của bạn.
Làm theo hướng dẫn quy tắc lập trình
.bzl
.Kiểm thử mã của bạn.
Tạo tài liệu để trợ giúp người dùng của bạn.
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.