Bài viết này đi sâu vào Khái Niệm Từ Phổ trong hệ thống xây dựng Bazel, trình bày các thuộc tính, quy tắc và mục tiêu xây dựng phổ biến, cùng với các khía cạnh quan trọng khác như mã hóa mã thông báo shell Bourne, mở rộng nhãn và thuộc tính có thể định cấu hình.
Mã Hóa Mã Thông Báo Shell Bourne
Một số thuộc tính chuỗi của các quy tắc trong Bazel sử dụng quy tắc mã hóa mã thông báo shell Bourne để chia thành nhiều từ. Dấu cách không được trích dẫn đóng vai trò là dấu phân cách giữa các từ, trong khi dấu ngoặc đơn, dấu ngoặc kép và dấu gạch chéo ngược được sử dụng để ngăn chặn việc tạo mã thông báo.
Các thuộc tính này thường được sử dụng để truyền các tùy chọn tùy ý đến trình biên dịch và các công cụ khác. Ví dụ: cc_library.copts
và java_library.javacopts
.
Mở Rộng Nhãn
Một số thuộc tính chuỗi của một số quy tắc tuân theo việc mở rộng nhãn. Nếu các chuỗi này chứa một nhãn hợp lệ dưới dạng chuỗi con (ví dụ: //mypkg:target
), nhãn đó sẽ được mở rộng thành đường dẫn của tệp được biểu thị bằng mục tiêu //mypkg:target
.
Ví dụ về các thuộc tính này bao gồm genrule.cmd
và cc_binary.linkopts
. Chi tiết cụ thể về cách mở rộng nhãn có thể khác nhau tùy theo từng trường hợp.
Các Thuộc Tính Thông Thường Được Định Nghĩa Bởi Hầu Hết Các Quy Tắc Bản Dựng
Phần này mô tả các thuộc tính được định nghĩa bởi nhiều quy tắc bản dựng, nhưng không phải tất cả.
Thuộc tính | Mô tả |
---|---|
data |
Danh sách các nhãn, mặc định là [] . Các tệp mà quy tắc này cần trong thời gian chạy. Các mục tiêu tệp hoặc quy tắc có thể được liệt kê. Đầu ra mặc định và tệp chạy của các mục tiêu trong thuộc tính data sẽ xuất hiện trong vùng *.runfiles của mọi tệp thực thi được tạo ra hoặc có phần phụ thuộc thời gian chạy trên mục tiêu này. Xem phần phần phụ thuộc dữ liệu để biết thêm thông tin. |
deps |
Danh sách các nhãn, mặc định là [] . Phần phụ thuộc cho mục tiêu này. Thường chỉ nên liệt kê các mục tiêu của quy tắc. Ngữ nghĩa chính xác của việc một mục tiêu phụ thuộc vào một mục tiêu khác bằng cách sử dụng deps là dành riêng cho loại quy tắc. Đối với các quy tắc xử lý mã nguồn, deps thường chỉ định các phần phụ thuộc mã mà mã sử dụng trong srcs . |
licenses |
Danh sách chuỗi; không thể định cấu hình; mặc định là ["none"] . Danh sách các chuỗi loại giấy phép sẽ được sử dụng cho mục tiêu cụ thể này. |
srcs |
Danh sách các nhãn, mặc định là [] . Các tệp được quy tắc này xử lý hoặc đưa vào. Thường liệt kê các tệp trực tiếp, nhưng có thể liệt kê các mục tiêu quy tắc (như filegroup hoặc genrule ) để bao gồm các đầu ra mặc định của chúng. |
Các Thuộc Tính Phổ Biến Cho Tất Cả Quy Tắc Bản Dựng
Phần này mô tả các thuộc tính được thêm ngầm vào tất cả các quy tắc xây dựng.
Thuộc tính | Mô tả |
---|---|
compatible_with |
Danh sách các nhãn; không thể định cấu hình; mặc định là [] . Danh sách các môi trường có thể tạo mục tiêu này, ngoài các môi trường được hỗ trợ mặc định. Đây là một phần của hệ thống quy tắc ràng buộc của Bazel, cho phép người dùng khai báo mục tiêu nào có thể và không thể phụ thuộc vào nhau. |
deprecation |
Chuỗi; không thể định cấu hình; mặc định là None . Thông báo cảnh báo giải thích liên quan đến mục tiêu này. Thông thường, thuộc tính này được dùng để thông báo cho người dùng rằng một mục tiêu đã lỗi thời hoặc đã bị một quy tắc khác thay thế. |
exec_compatible_with |
Danh sách các nhãn; không thể định cấu hình; mặc định là [] . Danh sách các constraint_values phải có trong nền tảng thực thi của nhóm thực thi mặc định của mục tiêu này. Điều này là ngoài mọi quy tắc ràng buộc mà loại quy tắc đã đặt. Các điều kiện ràng buộc được dùng để hạn chế danh sách các nền tảng thực thi có sẵn. |
exec_group_compatible_with |
Từ điển chuỗi thành danh sách các nhãn; không thể định cấu hình; mặc định là {} . Từ điển tên nhóm thực thi đến danh sách constraint_values phải có trong nền tảng thực thi cho nhóm thực thi nhất định. Điều này ngoài mọi quy tắc ràng buộc đã đặt trên định nghĩa của nhóm thực thi. Các điều kiện ràng buộc được dùng để hạn chế danh sách các nền tảng thực thi có sẵn. |
exec_properties |
Từ điển chuỗi; mặc định là {} . Từ điển chuỗi sẽ được thêm vào exec_properties của một nền tảng được chọn cho mục tiêu này. Nếu một khoá có trong cả thuộc tính nền tảng và thuộc tính cấp mục tiêu, thì giá trị sẽ được lấy từ mục tiêu. Bạn có thể đặt tiền tố cho khoá bằng tên của một nhóm thực thi, theo sau là . để chỉ áp dụng các khoá đó cho nhóm thực thi cụ thể đó. |
features |
Danh sách các chuỗi tính năng; mặc định là [] . Tính năng là thẻ chuỗi có thể được bật hoặc tắt trên một mục tiêu. Ý nghĩa của một tính năng phụ thuộc vào chính quy tắc đó. |
package_metadata |
Danh sách các nhãn; không thể định cấu hình; mặc định là <a href="https://bazel.build/reference/be/functions?hl=vi#package.default_package_metadata">default_package_metadata</a> của gói. Danh sách nhãn là siêu dữ liệu được liên kết về mục tiêu này. |
restricted_to |
Danh sách các nhãn; không thể định cấu hình; mặc định là [] . Danh sách các môi trường có thể tạo mục tiêu này, thay vì các môi trường được hỗ trợ mặc định. |
tags |
Danh sách chuỗi; không thể định cấu hình; mặc định là [] . Bạn có thể sử dụng thẻ trên bất kỳ quy tắc nào. Thẻ trên quy tắc kiểm thử và test_suite rất hữu ích để phân loại các quy tắc kiểm thử. |
target_compatible_with |
Danh sách các nhãn; mặc định là [] . Danh sách các constraint_value phải có trong nền tảng mục tiêu để mục tiêu này được coi là tương thích. Nếu nền tảng mục tiêu không đáp ứng tất cả các quy tắc ràng buộc được liệt kê, thì mục tiêu đó được coi là không tương thích. Các mục tiêu không tương thích sẽ bị bỏ qua để tạo bản dựng và kiểm thử khi mẫu mục tiêu được mở rộng (ví dụ: //... , :all ). |
testonly |
Boolean; không thể định cấu hình; mặc định là False ngoại trừ các mục tiêu kiểm thử và bộ kiểm thử. Nếu là True , thì chỉ các mục tiêu testonly (chẳng hạn như kiểm thử) mới có thể phụ thuộc vào mục tiêu này. |
toolchains |
Danh sách các nhãn; không thể định cấu hình; mặc định là [] . Tập hợp các mục tiêu có Biến tạo mà mục tiêu này được phép truy cập. |
visibility |
Danh sách các nhãn; không thể định cấu hình; mặc định thay đổi. Thuộc tính visibility kiểm soát xem các mục tiêu ở vị trí khác có thể phụ thuộc vào mục tiêu hay không. |
Ví dụ trên minh họa cách sử dụng `select()` để chọn các nguồn khác nhau cho các cấu trúc mục tiêu khác nhau trong Bazel.
Các Thuộc Tính Phổ Biến Cho Tất Cả Quy Tắc Kiểm Thử (*_test)
Phần này mô tả các thuộc tính phổ biến cho tất cả quy tắc kiểm thử.
Thuộc tính | Mô tả |
---|---|
args |
Danh sách chuỗi; tuân theo quy tắc thay thế $(location) và “Tạo biến”, cũng như tạo mã thông báo shell Bourne; mặc định là [] . Các đối số dòng lệnh mà Bazel truyền đến mục tiêu khi mục tiêu đó được thực thi bằng bazel test . |
env |
Từ điển chuỗi; các giá trị phải tuân theo quy tắc thay thế $(location) và “Tạo biến”; mặc định là {} . Chỉ định các biến môi trường bổ sung cần đặt khi bazel test thực thi kiểm thử. |
env_inherit |
Danh sách chuỗi; mặc định là [] . Chỉ định các biến môi trường bổ sung để kế thừa từ môi trường bên ngoài khi bazel test thực thi kiểm thử. |
size |
Chuỗi "enormous" , "large" , "medium" hoặc "small" ; không thể định cấu hình; mặc định là "medium" . Chỉ định “độ nặng” của mục tiêu kiểm thử: lượng thời gian/tài nguyên cần thiết để chạy mục tiêu đó. |
timeout |
Chuỗi "short" , "moderate" , "long" hoặc "eternal" ; không thể định cấu hình; mặc định được lấy từ thuộc tính size của kiểm thử. Thời gian dự kiến để chạy kiểm thử trước khi trả về. |
flaky |
Boolean; không thể định cấu hình; giá trị mặc định là False . Đánh dấu kiểm thử là không ổn định. Nếu được đặt, hãy thực thi kiểm thử tối đa 3 lần, chỉ đánh dấu kiểm thử là không thành công nếu kiểm thử không thành công mỗi lần. |
shard_count |
Số nguyên không âm nhỏ hơn hoặc bằng 50; mặc định là -1 . Chỉ định số lượng phân đoạn song song để sử dụng khi chạy kiểm thử. |
local |
Boolean; không thể định cấu hình; giá trị mặc định là False . Buộc chạy kiểm thử cục bộ mà không cần hộp cát. Việc đặt giá trị này thành True tương đương với việc cung cấp “local” làm thẻ (tags=["local"] ). |
Các Thuộc Tính Chung Cho Tất Cả Quy Tắc Nhị Phân (*_binary)
Phần này mô tả các thuộc tính phổ biến cho tất cả quy tắc nhị phân.
Thuộc tính | Mô tả |
---|---|
args |
Danh sách chuỗi; tuân theo việc thay thế $(location) và “Tạo biến” và tổng hợp mã thông báo Bourne shell; không thể định cấu hình; mặc định là [] . Các đối số dòng lệnh mà Bazel sẽ truyền đến mục tiêu khi mục tiêu đó được thực thi bằng lệnh run hoặc dưới dạng kiểm thử. |
env |
Từ điển chuỗi; các giá trị phải tuân theo quy tắc thay thế $(location) và “Tạo biến”; mặc định là {} . Chỉ định các biến môi trường bổ sung cần đặt khi mục tiêu được bazel run thực thi. |
output_licenses |
Danh sách chuỗi; mặc định là [] . Giấy phép của các tệp đầu ra mà tệp nhị phân này tạo ra. |
Thuộc Tính Có Thể Định Cấu Hình
Hầu hết các thuộc tính đều “có thể định cấu hình”, nghĩa là giá trị của các thuộc tính này có thể thay đổi khi mục tiêu được tạo theo nhiều cách, dựa trên các cờ được truyền đến dòng lệnh Bazel hoặc phần phụ thuộc hạ nguồn đang yêu cầu mục tiêu.
Hàm select()
chọn trong số các giá trị thay thế khác nhau cho một thuộc tính có thể định cấu hình dựa trên tiêu chí config_setting
hoặc constraint_value
mà cấu hình của mục tiêu đáp ứng.
Bazel đánh giá các thuộc tính có thể định cấu hình sau khi xử lý macro và trước khi xử lý quy tắc.
Mục Tiêu Đầu Ra Ngầm Ẩn
Khi xác định quy tắc bản dựng trong tệp BUILD, bạn đang khai báo rõ ràng một mục tiêu quy tắc mới, được đặt tên trong một gói. Nhiều hàm quy tắc bản dựng cũng ngầm ẩn bao gồm một hoặc nhiều mục tiêu tệp đầu ra, nội dung và ý nghĩa của các mục tiêu này là dành riêng cho quy tắc.
Mục tiêu đầu ra ngầm ẩn là thành viên hạng nhất của biểu đồ mục tiêu toàn cục. Giống như các mục tiêu khác, các mục tiêu này được tạo theo yêu cầu. Bạn có thể tham chiếu các tệp này dưới dạng phần phụ thuộc trong tệp BUILD và có thể quan sát được trong kết quả của các công cụ phân tích như bazel query
.