Trang này mô tả cách mở rộng ngôn ngữ XÂY DỰNG bằng macro và quy tắc.
Phần mở rộng Bazel là các tệp có đuôi là .bzl
. Sử dụng câu lệnh tải để nhập một 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, hãy:
Đọ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ẻ các biến giữa hai tệp
BUILD
.
Macro và quy tắc
Macro là hàm tạo thực thể cho quy tắc. Tính năng này rất hữu ích khi tệp BUILD
có tính lặp lại hoặc quá phức tạp, vì tệp này 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ó ít thông tin về macro:
nếu macro của bạn tạo ra 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 mẽ hơn macro. Ứng dụng này có thể truy cập vào dữ liệu nội bộ của Bazel và có toàn quyền kiểm soát những gì đang diễn ra. Ví dụ: trường hợp này có thể truyền thông tin đến 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ở nên phức tạp, bạn nên đặt macro đó thành quy tắc. Việc hỗ trợ một ngôn ngữ mới thường được thực hiện thông qua một quy tắc. Quy tắc dành cho người dùng thành thạo 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á
Quá trình xây dựng gồm ba giai đoạn.
Giai đoạn tải. Trước tiên, hãy tải và đánh giá tất cả tiện ích cũng như mọi tệp
BUILD
cần thiết cho bản dựng. Việc thực thi các tệpBUILD
chỉ 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 đó sẽ được thêm vào 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
) và các hành động được tạo thực thể. Một thao tác mô tả cách tạo 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õ các 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 một biểu đồ hành động.Giai đoạn thực thi. Các thao tác được thực thi khi cần có ít nhất một trong các kết quả của các thao tá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ả, thì bản dựng sẽ không thể tạo được kết quả. Hoạt động kiểm thử cũng đượ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
cũng như các tệp BUILD
. Tệp được đọc tối đa một lần cho mỗi bản dựng 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á sau khi tất cả các phần phụ thuộc (câu lệnh load()
) đã được giải quyết. Theo thiết kế, việc tải tệp .bzl
không có hiệu ứng phụ hiển thị, mà chỉ xác định các giá trị và hàm.
Bazel cố gắng trở nên thông minh: sử dụng quy trình phân tích phần phụ thuộc để biết cần tải tệp nào, phân tích quy tắc nào và thực hiện hành động nào. Ví dụ: nếu một quy tắc tạo ra các hành động mà bạn không cần cho bản dựng hiện tại, thì các hành động đó sẽ không được thực thi.
Tạo tiện ích
Tạo macro đầu tiên của bạ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 chúng để tạo "động từ tuỳ chỉnh".
Làm theo hướng dẫn về quy tắc để bắt đầu sử dụng 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ữ cho chúng trong tầm tay:
Tìm hiểu thêm
Ngoài macro và quy tắc, bạn nên viết quy tắc và quy tắc 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 về quy tắc lập trình
.bzl
.Kiểm tra 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 tiện ích của bạn cho những người khác.