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

Báo cáo vấn đề Xem nguồn Nightly · 7.4 . 7.3 · 7.2 · 7.1 · 7.0 · 6.5

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à các tệp có đuôi .bzl. Sử dụng câu lệnh tải để nhập một ký hiệu 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:

Macro và quy tắc

Macro là một hàm tạo bản sao cho các quy tắc. Macro có hai loại: macro tượng trưng (mới trong Bazel 8) và macro cũ. Hai phiên bản macro được xác định 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 sẽ 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 đọc tệp BUILD. Sau khi đánh giá tệp BUILD, Bazel có ít thông tin về các macro. Nếu macro của bạn tạo ra một genrule, thì Bazel sẽ hoạt động gần như như thể bạn đã khai báo genrule đó trong tệp BUILD. (Trường hợp ngoại lệ duy nhất là các mục tiêu được khai báo trong một macro tượng trưng có ngữ nghĩa chế độ 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. Công cụ này có thể truy cập vào các phần 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ụ: quy tắc này có thể chuyể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 với một macro; bạn nên sử 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 đặt macro đó làm quy tắc. Hỗ trợ cho 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 ba 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ả tệp BUILD cần thiết cho bản dựng. Việc thực thi tệp BUILD chỉ đơn giản là tạo bản sao 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 đánh giá macro.

  • 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 bản sao. 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à lấy 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 ít nhất một trong các đầu ra của chúng là bắt buộ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 chương trình 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 và tệp BUILD. Mỗi bản dựng chỉ đọc một tệp nhiều nhất một lần và kết quả của quá trình đá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ả phần phụ thuộc (câu lệnh load()) của tệp đó đã được phân giải. 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: sử dụng tính năng phân tích phần phụ thuộc để biết cần tải tệp nào, cần phân tích quy tắc nào và cần thực thi 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 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 các tiện ích của riêng mình. Hãy để các thiết bị đó ở trong tầm tay:

Vươn xa hơn

Ngoài macroquy tắc, bạn nên viết phương diệnquy tắc kho lưu trữ.