Tổng quan về phần mở rộng

Trang này mô tả cách mở rộng ngôn ngữ BUILD bằng macro và quy tắc.

Phần mở rộng Bazel là các tệp có đuôi .bzl. Sử dụng một câu lệnh tải để nhập một ký hiệu từ phần mở rộng.

Trước khi tìm hiểu các khái niệm nâng cao hơn, trước tiên, hãy:

Macro và quy tắc

Macro là một hàm khởi tạo các quy tắc. Macro 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 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.

Một quy tắc mạnh hơn macro. Quy tắc có thể truy cập vào các thành phần bên trong của Bazel và kiểm soát hoàn toàn những gì đang diễn ra. Ví dụ: quy tắc có thể truyền thông tin cho các quy tắc khác.

Nếu bạn muốn 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, thì thường nên chuyển thành quy tắc. Tính năng hỗ trợ cho ngôn ngữ mới thường được thực hiện bằng 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á

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ả phần mở rộng và tất cả tệp BUILD cần thiết cho bản dựng. Việc thực thi các tệp BUILD chỉ đơn giản là khởi tạo 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 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 khởi tạo. Một 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 hành động được thực thi khi cần ít nhất một trong các đầu ra của chúng. Nếu một tệp bị thiếu hoặc nếu một lệnh không tạo được một đầu ra, thì bản dựng sẽ không thành công. Các bài 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ột tệp được đọc tối đa một lần cho mỗi bản dựng và kết quả đánh giá được lưu vào bộ nhớ đệm và 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 giải quyết. Theo thiết kế, việc tải tệp .bzl không có tác dụng phụ rõ ràng, 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 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 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 phần mở rộng

Hai đường liên kết bên dưới sẽ rất hữu ích khi bạn viết phần mở rộng của riêng mình. Hãy lưu giữ các đường liên kết này trong tầm tay:

Vươn xa hơn

Ngoài macroquy tắc, bạn có thể muốn viết các khía cạnhquy tắc kho lưu trữ.