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

Báo cáo vấn đề Xem nguồn Nightly/3}

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:

Macro và quy tắc

Macro là một hàm tạo thực thể cho các quy tắc. Phương thức này rất hữu ích khi tệp BUILD quá 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 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ụ: ứng dụng 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 một macro trở nên phức tạp, bạn nên biến 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 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á mọi 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ệp BUILD chỉ đơn giản là 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 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 tạo thực thể. 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à get hello.o". Bạn phải liệt kê rõ ràng 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 sẽ đượ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 đầu ra, thì bản dựng sẽ không hoạt độ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 cũng như tệp BUILD. Hệ thống sẽ đọc tệp tối đa một lần cho mỗi bản dựng, kết quả đánh giá sẽ được lưu vào bộ nhớ đệm và sử dụng lại. Tệp chỉ được đánh giá 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 mà chỉ xác định các giá trị và hàm.

Bazel cố gắng khéo léo: sử dụng tính năng phân tích phần phụ thuộc để biết tệp nào phải được tải, quy tắc nào cần đượ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 không cần thiết cho bản dựng hiện tại, thì các thao tác đó sẽ không được thực thi.

Tạo phần mở rộng

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 ảnh trong tầm tay:

Tìm hiểu thêm

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