Định nghĩa phổ biến

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

Phần này xác định nhiều thuật ngữ và khái niệm phổ biến đối với nhiều hàm hoặc quy tắc xây dựng.

Nội dung

Mã hoá mã thông báo shell Bourne

Một số thuộc tính chuỗi của một số quy tắc được chia thành nhiều từ theo quy tắc tạo mã thông báo của shell Bourne: dấu cách không được trích dẫn phân định các từ riêng biệt, còn dấu ngoặc kép đơn và kép cũng như dấu gạch chéo ngược được dùng để ngăn việc tạo mã thông báo.

Những thuộc tính chịu sự mã hoá này được chỉ định rõ ràng trong định nghĩa của chúng trong tài liệu này.

Các thuộc tính chịu sự mở rộng biến "Tạo" và mã hoá mã thông báo của Bourne shell thường được dùng để truyền các tuỳ chọn tuỳ ý đến trình biên dịch và các công cụ khác. Ví dụ về các thuộc tính như vậy là cc_library.coptsjava_library.javacopts. Cùng với nhau, các hoạt động thay thế này cho phép một biến chuỗi mở rộng thành một danh sách từ tuỳ chọn dành riêng cho cấu hình.

Mở rộng nhãn

Một số thuộc tính chuỗi của một số ít quy tắc phải tuân theo việc mở rộng nhãn: nếu các chuỗi đó chứa một nhãn hợp lệ dưới dạng một chuỗi con, chẳng hạn như //mypkg:target và nhãn đó là điều kiện tiên quyết đã khai báo của quy tắc hiện tại, thì 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 bao gồm genrule.cmdcc_binary.linkopts. Thông tin chi tiết có thể khác nhau đáng kể trong từng trường hợp, về các vấn đề như: liệu nhãn tương đối có được mở rộng hay không; cách xử lý các nhãn mở rộng sang nhiều tệp, v.v. Hãy tham khảo tài liệu về thuộc tính quy tắc để biết thông tin chi tiết.

Các thuộc tính thông thường do hầu hết các quy tắc bản dựng xác định

Phần này mô tả các thuộc tính được xác định 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 nhãn; mặc định là []

Các tệp mà quy tắc này cần đến trong thời gian chạy. Có thể liệt kê các mục tiêu tệp hoặc quy tắc. Thường cho phép mọi mục tiêu.

Đầ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. Điều này có thể bao gồm các tệp dữ liệu hoặc tệp nhị phân được sử dụng khi srcs của mục tiêu này được thực thi. Hãy xem phần phần phụ thuộc dữ liệu để biết thêm thông tin về cách phụ thuộc và sử dụng tệp dữ liệu.

Các quy tắc mới phải xác định thuộc tính data nếu chúng xử lý các dữ liệu đầu vào có thể sử dụng các dữ liệu đầu vào khác trong thời gian chạy. Các hàm triển khai quy tắc cũng phải điền sẵn tệp chạy của mục tiêu từ các đầu ra và tệp chạy của bất kỳ thuộc tính data nào, cũng như tệp chạy từ bất kỳ thuộc tính phần phụ thuộc nào cung cấp mã nguồn hoặc phần phụ thuộc thời gian chạy.

deps

Danh sách 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. (Mặc dù một số quy tắc cho phép liệt kê tệp trực tiếp trong deps, nhưng bạn nên tránh việc này nếu có thể.)

Quy tắc theo ngôn ngữ cụ thể thường giới hạn các mục tiêu được liệt kê ở những mục tiêu có nhà cung cấp cụ thể.

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 và tài liệu dành riêng cho quy tắc sẽ trình bày chi tiết hơn. Đố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.

Thông thường, phần phụ thuộc deps được dùng để cho phép một mô-đun sử dụng các ký hiệu được xác định trong một mô-đun khác được viết bằng cùng một ngôn ngữ lập trình và được biên dịch riêng biệt. Các phần phụ thuộc đa ngôn ngữ cũng được cho phép trong nhiều trường hợp: Ví dụ: mục tiêu java_library có thể phụ thuộc vào mã C++ trong mục tiêu cc_library, bằng cách liệt kê mục tiêu sau trong thuộc tính deps. Hãy xem định nghĩa về phần phụ thuộc để biết thêm thông tin.

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. Đây là một phần của API cấp phép không dùng nữa mà Bazel không còn sử dụng. Đừng sử dụng thuộc tính này.

srcs

Danh sách 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ê trực tiếp các tệ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 quy tắc theo ngôn ngữ thường yêu cầu các tệp được liệt kê phải có đuôi tệp cụ thể.

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ả quy tắc xây dựng.

Thuộc tính Mô tả
compatible_with

Danh sách 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. Ví dụ: tệp nhị phân có thể triển khai bên ngoài không được phụ thuộc vào các thư viện có mã bí mật của công ty. Hãy xem ConstraintSemantics để biết thông tin chi tiết.

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ế, là riêng tư đối với một gói hoặc có thể bị coi là gây hại vì một số lý do. Bạn nên thêm một số tài liệu tham khảo (chẳng hạn như trang web, số lỗi hoặc ví dụ về CL di chuyển) để người dùng có thể dễ dàng tìm ra những thay đổi cần thiết để tránh thông báo này. Nếu có một mục tiêu mới có thể được dùng để thay thế mục tiêu cũ, bạn chỉ nên di chuyển tất cả người dùng của mục tiêu cũ.

Thuộc tính này không ảnh hưởng đến cách tạo các mục, nhưng có thể ảnh hưởng đến kết quả chẩn đoán của công cụ tạo bản dựng. Công cụ xây dựng sẽ đưa ra cảnh báo khi một mục tiêu trong một gói khác phụ thuộc vào một quy tắc có thuộc tính deprecation.

Các phần phụ thuộc trong gói sẽ được miễn cảnh báo này, ví dụ: việc tạo các bài kiểm thử của một quy tắc không dùng nữa sẽ không gặp cảnh báo.

Nếu một mục tiêu không dùng nữa phụ thuộc vào một mục tiêu không dùng nữa khác, thì hệ thống sẽ không đưa ra thông báo cảnh báo.

Sau khi người dùng ngừng sử dụng, bạn có thể xoá mục tiêu đó.

distribs

Danh sách chuỗi; không thể định cấu hình; mặc định là []

Danh sách các chuỗi phương thức phân phối sẽ được sử dụng cho mục tiêu cụ thể này. Đây là một phần của API cấp phép không dùng nữa mà Bazel không còn sử dụng. Đừng sử dụng thuộc tính này.

exec_compatible_with

Danh sách nhãn; không thể định cấu hình; mặc định là []

Danh sách constraint_values phải có trong nền tảng thực thi cho mục tiêu này. Điều này ngoài mọi quy tắc ràng buộc đã được đặt theo loại quy tắc. 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. Để biết thêm thông tin, hãy xem nội dung mô tả về độ phân giải chuỗi công cụ.

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. Xem exec_properties của quy tắc nền tảng.

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.

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 đó.

Thuộc tính features này được kết hợp với thuộc tính features cấp gói. Ví dụ: nếu các tính năng ["a", "b"] được bật ở cấp gói và thuộc tính features của mục tiêu chứa ["-a", "c"], thì các tính năng được bật cho quy tắc sẽ là "b" và "c". Xem ví dụ.

restricted_to

Danh sách 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.

Đây là một phần của hệ thống quy tắc ràng buộc của Bazel. Hãy xem compatible_with để biết thông tin chi tiết.

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ử. Thẻ trên các mục tiêu không phải mục tiêu kiểm thử được dùng để kiểm soát việc thực thi trong hộp cát của các thao tác genruleStarlark, cũng như để phân tích cú pháp bằng con người và/hoặc các công cụ bên ngoài.

Bazel sửa đổi hành vi của mã hộp cát nếu tìm thấy các từ khoá sau trong thuộc tính tags của bất kỳ mục tiêu kiểm thử hoặc genrule nào hoặc các khoá của execution_requirements cho bất kỳ thao tác Starlark nào.

  • Từ khoá no-sandbox khiến thao tác hoặc kiểm thử không bao giờ được đưa vào hộp cát; thao tác hoặc kiểm thử vẫn có thể được lưu vào bộ nhớ đệm hoặc chạy từ xa – hãy sử dụng no-cache hoặc no-remote để ngăn chặn một hoặc cả hai thao tác đó.
  • Từ khoá no-cache khiến hành động hoặc thử nghiệm không bao giờ được lưu vào bộ nhớ đệm (từ xa hoặc cục bộ)
  • Từ khoá no-remote-cache khiến thao tác hoặc kiểm thử không bao giờ được lưu vào bộ nhớ đệm từ xa (nhưng có thể được lưu vào bộ nhớ đệm cục bộ; cũng có thể được thực thi từ xa). Lưu ý: đối với thẻ này, bộ nhớ đệm trên ổ đĩa được coi là bộ nhớ đệm cục bộ, còn bộ nhớ đệm http và gRPC được coi là bộ nhớ đệm từ xa. Nếu bạn sử dụng kết hợp bộ nhớ đệm ổ đĩa cục bộ và bộ nhớ đệm từ xa (bộ nhớ đệm kết hợp), thì bộ nhớ đệm này sẽ được coi là bộ nhớ đệm từ xa và bị tắt hoàn toàn, trừ phi bạn đặt --incompatible_remote_results_ignore_disk. Trong trường hợp này, các thành phần cục bộ sẽ được sử dụng.
  • Từ khoá no-remote-exec khiến thao tác hoặc kiểm thử không bao giờ được thực thi từ xa (nhưng có thể được lưu vào bộ nhớ đệm từ xa).
  • Từ khoá no-remote ngăn hành động hoặc kiểm thử được thực thi từ xa hoặc lưu vào bộ nhớ đệm từ xa. Điều này tương đương với việc sử dụng cả no-remote-cacheno-remote-exec.
  • Từ khoá no-remote-cache-upload tắt phần tải lên của quá trình lưu vào bộ nhớ đệm từ xa của một quá trình tạo. không tắt tính năng thực thi từ xa.
  • Từ khoá local ngăn hành động hoặc kiểm thử được lưu vào bộ nhớ đệm từ xa, thực thi từ xa hoặc chạy bên trong hộp cát. Đối với genrules và kiểm thử, việc đánh dấu quy tắc bằng thuộc tính local = True cũng có tác dụng tương tự.
  • Từ khoá requires-network cho phép truy cập vào mạng bên ngoài từ bên trong hộp cát. Thẻ này chỉ có hiệu lực nếu bạn bật tính năng hộp cát.
  • Từ khoá block-network chặn quyền truy cập vào mạng bên ngoài từ bên trong hộp cát. Trong trường hợp này, chỉ cho phép giao tiếp với máy chủ cục bộ. Thẻ này chỉ có hiệu lực nếu bạn bật tính năng hộp cát.
  • requires-fakeroot chạy kiểm thử hoặc hành động dưới dạng uid và gid 0 (tức là người dùng gốc). Tính năng này chỉ được hỗ trợ trên Linux. Thẻ này được ưu tiên hơn tuỳ chọn dòng lệnh --sandbox_fake_username.

Thẻ trên kiểm thử thường được dùng để chú thích vai trò của kiểm thử trong quá trình gỡ lỗi và phát hành. Thông thường, thẻ hữu ích nhất cho các chương trình kiểm thử C++ và Python, vì các chương trình này không có khả năng chú thích thời gian chạy. Việc sử dụng thẻ và các phần tử kích thước giúp bạn linh hoạt trong việc tập hợp các bộ kiểm thử dựa trên chính sách kiểm tra cơ sở mã.

Bazel sửa đổi hành vi chạy kiểm thử nếu tìm thấy các từ khoá sau trong thuộc tính tags của quy tắc kiểm thử:

  • exclusive sẽ buộc chạy kiểm thử ở chế độ "độc quyền", đảm bảo rằng không có kiểm thử nào khác đang chạy cùng lúc. Các kiểm thử như vậy sẽ được thực thi theo tuần tự sau khi tất cả hoạt động bản dựng và kiểm thử không độc quyền đã hoàn tất. Tính năng thực thi từ xa bị tắt đối với các kiểm thử như vậy vì Bazel không có quyền kiểm soát đối với những gì đang chạy trên máy từ xa.
  • exclusive-if-local sẽ buộc chạy kiểm thử ở chế độ "độc quyền" nếu kiểm thử được thực thi cục bộ, nhưng sẽ chạy kiểm thử song song nếu kiểm thử được thực thi từ xa.
  • Từ khoá manual sẽ loại trừ mục tiêu khỏi việc mở rộng ký tự đại diện mẫu mục tiêu (..., :*, :all, v.v.) và các quy tắc test_suite không liệt kê rõ ràng kiểm thử khi tính toán tập hợp các mục tiêu cấp cao nhất để tạo/chạy cho các lệnh build, testcoverage. Việc này không ảnh hưởng đến ký tự đại diện mục tiêu hoặc việc mở rộng bộ kiểm thử trong các ngữ cảnh khác, bao gồm cả lệnh query. Xin lưu ý rằng manual không có nghĩa là mục tiêu không được tạo/chạy tự động bằng các hệ thống xây dựng/kiểm thử liên tục. Ví dụ: bạn nên loại trừ một mục tiêu khỏi bazel test ... vì mục tiêu đó yêu cầu các cờ Bazel cụ thể, nhưng vẫn đưa mục tiêu đó vào các lần chạy kiểm thử liên tục hoặc trước khi gửi được định cấu hình đúng cách.
  • Từ khoá external sẽ buộc kiểm thử được thực thi vô điều kiện (bất kể giá trị --cache_test_results).
Xem phần Quy ước thẻ trong Bách khoa toàn thư về kiểm thử để biết thêm các quy ước về thẻ được đính kèm vào mục tiêu kiểm thử.
target_compatible_with

Danh sách 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. Điều này là ngoài mọi quy tắc ràng buộc đã được đặt bởi loại quy tắc. 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). Khi được chỉ định rõ ràng trên dòng lệnh, các mục tiêu không tương thích sẽ khiến Bazel in lỗi và gây ra lỗi bản dựng hoặc kiểm thử.

Các mục tiêu phụ thuộc bắc cầu vào các mục tiêu không tương thích cũng được coi là không tương thích. Các lớp này cũng bị bỏ qua khi tạo và kiểm thử.

Danh sách trống (mặc định) cho biết mục tiêu tương thích với tất cả nền tảng.

Tất cả quy tắc ngoại trừ Quy tắc Workspace đều hỗ trợ thuộc tính này. Đối với một số quy tắc, thuộc tính này không có hiệu lực. Ví dụ: việc chỉ định target_compatible_with cho cc_toolchain là không hữu ích.

Hãy xem trang Nền tảng để biết thêm thông tin về việc bỏ qua mục tiêu không tương thích.

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.

Tương tự, một quy tắc không phải là testonly không được phép phụ thuộc vào bất kỳ quy tắc nào là testonly.

Theo mặc định, các chương trình kiểm thử (quy tắc *_test) và bộ kiểm thử (quy tắc test_suite) là testonly.

Thuộc tính này có nghĩa là mục tiêu không được chứa trong các tệp nhị phân được phát hành cho bản phát hành chính thức.

Vì testonly được thực thi tại thời điểm tạo bản dựng, chứ không phải thời gian chạy và được truyền tải mạnh mẽ thông qua cây phần phụ thuộc, nên bạn cần áp dụng tính năng này một cách thận trọng. Ví dụ: các mã giả và mã giả hữu ích cho kiểm thử đơn vị cũng có thể hữu ích cho kiểm thử tích hợp liên quan đến cùng một tệp nhị phân sẽ được phát hành cho bản phát hành chính thức, do đó, có thể không được đánh dấu là chỉ kiểm thử. Ngược lại, các quy tắc nguy hiểm ngay cả khi liên kết, có thể là do các quy tắc này ghi đè hành vi bình thường một cách vô điều kiện, chắc chắn phải được đánh dấu là chỉ kiểm thử.

toolchains

Danh sách 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. Các mục tiêu này là các thực thể của quy tắc cung cấp TemplateVariableInfo hoặc các mục tiêu đặc biệt cho các loại chuỗi công cụ được tích hợp vào Bazel. Các tính năng này bao gồm:

  • @bazel_tools//tools/cpp:current_cc_toolchain
  • @bazel_tools//tools/jdk:current_java_runtime

Xin lưu ý rằng điều này khác với khái niệm độ phân giải chuỗi công cụ mà các hoạt động triển khai quy tắc sử dụng cho cấu hình phụ thuộc vào nền tảng. Bạn không thể sử dụng thuộc tính này để xác định cc_toolchain hoặc java_toolchain cụ thể mà mục tiêu sẽ sử dụng.

visibility

Danh sách nhãn; không thể định cấu hình; mặc định là default_visibility từ gói nếu được chỉ định, hoặc "//visibility:private" nếu không

Thuộc tính visibility trên một mục tiêu kiểm soát xem mục tiêu có thể được sử dụng trong các gói khác hay không. Hãy xem tài liệu về mức độ hiển thị.

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)"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.

Các đối số này được truyền trước mọi giá trị --test_arg được chỉ định trên dòng lệnh bazel test.

env

Từ điển chuỗi; các giá trị phải tuân theo quy tắc thay thế $(location)"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ử.

Thuộc tính này chỉ áp dụng cho các quy tắc gốc, chẳng hạn như cc_test, py_testsh_test. Quy tắc này không áp dụng cho các quy tắc kiểm thử do Starlark xác định. Đối với các quy tắc Starlark của riêng mình, bạn có thể thêm thuộc tính "env" và sử dụng thuộc tính này để điền vào Nhà cung cấp TestEnvironment.

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ử.

Thuộc tính này chỉ áp dụng cho các quy tắc gốc, chẳng hạn như cc_test, py_testsh_test. Quy tắc này không áp dụng cho các quy tắc kiểm thử do Starlark xác định.

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 đó.

Kiểm thử đơn vị được coi là "nhỏ", kiểm thử tích hợp là "vừa" và kiểm thử toàn diện là "lớn" hoặc "rất lớn". Bazel sử dụng kích thước để xác định thời gian chờ mặc định. Bạn có thể ghi đè thời gian chờ này bằng cách sử dụng thuộc tính timeout. Thời gian chờ áp dụng cho tất cả các chương trình kiểm thử trong mục tiêu BUILD, chứ không phải cho từng chương trình kiểm thử riêng lẻ. Khi kiểm thử chạy cục bộ, size cũng được dùng cho mục đích lên lịch: Bazel cố gắng tuân thủ --local_{ram,cpu}_resources và không làm quá tải máy cục bộ bằng cách chạy nhiều chương trình kiểm thử nặng cùng một lúc.

Kích thước kiểm thử tương ứng với các thời gian chờ mặc định sau đây và mức sử dụng tài nguyên cục bộ cao nhất giả định:

Kích thước RAM (tính bằng MB) CPU (trong lõi CPU) Thời gian chờ mặc định
nhỏ 20 1 ngắn (1 phút)
trung bình 100 1 vừa phải (5 phút)
lớn 300 1 dài (15 phút)
rất lớn 800 1 vĩnh viễn (60 phút)

Biến môi trường TEST_SIZE sẽ được đặt thành giá trị của thuộc tính này khi tạo kiểm thử.

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 để kiểm thử chạy trước khi trả về.

Mặc dù thuộc tính kích thước của kiểm thử kiểm soát việc ước tính tài nguyên, nhưng bạn có thể đặt thời gian chờ của kiểm thử một cách độc lập. Nếu bạn không chỉ định rõ ràng, thời gian chờ sẽ dựa trên kích thước của kiểm thử. Bạn có thể ghi đè thời gian chờ kiểm thử bằng cờ --test_timeout, ví dụ: để chạy trong một số điều kiện nhất định được biết là chậm. Giá trị thời gian chờ kiểm thử tương ứng với các khoảng thời gian sau:

Giá trị thời gian chờ Khoảng thời gian
ngắn 1 phút
vừa 5 phút
long 15 phút
vĩnh cửu 60 phút

Đối với các thời gian khác với thời gian nêu trên, bạn có thể ghi đè thời gian chờ kiểm thử bằng cờ bazel --test_timeout, ví dụ: để chạy theo cách thủ công trong các điều kiện được biết là chậm. Các giá trị --test_timeout được tính bằng giây. Ví dụ: --test_timeout=120 sẽ đặt thời gian chờ kiểm thử thành 2 phút.

Biến môi trường TEST_TIMEOUT sẽ được đặt thành thời gian chờ kiểm thử (tính bằng giây) khi tạo kiểm thử.

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. Theo mặc định, thuộc tính này được đặt thành False và quy trình kiểm thử chỉ được thực thi một lần. Xin lưu ý rằng bạn không nên sử dụng thuộc tính này – các kiểm thử phải vượt qua một cách đáng tin cậy khi các câu nhận định được duy trì.

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ử.

Nếu được đặt, giá trị này sẽ ghi đè mọi phương pháp phỏng đoán được dùng để xác định số lượng phân đoạn song song để chạy kiểm thử. Xin lưu ý rằng đối với một số quy tắc kiểm thử, bạn có thể cần tham số này để bật tính năng phân đoạn ngay từ đầu. Xem thêm --test_sharding_strategy.

Nếu bạn bật tính năng phân đoạn kiểm thử, biến môi trường TEST_TOTAL_SHARDS sẽ được đặt thành giá trị này khi tạo kiểm thử.

Tính năng phân đoạn yêu cầu trình chạy kiểm thử hỗ trợ giao thức phân đoạn kiểm thử. Nếu không, thì rất có thể nó sẽ chạy mọi chương trình kiểm thử trong mọi phân mảnh, điều này không phải là điều bạn muốn.

Hãy xem phần Phân đoạn kiểm thử trong Bách khoa toàn thư về kiểm thử để biết thông tin chi tiết về phân đoạn.

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)"Tạo biến"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ử. Các đối số này được truyền trước các đối số được chỉ định trên dòng lệnh bazel run hoặc bazel test.

LƯU Ý: Các đối số không được truyền khi bạn chạy mục tiêu bên ngoài Bazel (ví dụ: bằng cách thực thi tệp nhị phân theo cách thủ công trong bazel-bin/).

env

Từ điển chuỗi; các giá trị phải tuân theo quy tắc thay thế $(location)"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.

Thuộc tính này chỉ áp dụng cho các quy tắc gốc, chẳng hạn như cc_binary, py_binarysh_binary. Quy tắc này không áp dụng cho các quy tắc thực thi do Starlark xác định.

LƯU Ý: Các biến môi trường không được đặt khi bạn chạy mục tiêu bên ngoài Bazel (ví dụ: bằng cách thực thi tệp nhị phân theo cách thủ công trong bazel-bin/).

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. Đây là một phần của API cấp phép không dùng nữa mà Bazel không còn sử dụng. Đừng sử dụng thuộc tính này.

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. Cụ thể, các thuộc tính có thể định cấu hình có thể thay đổi 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. Bạn có thể sử dụng tính năng này để tuỳ chỉnh mục tiêu cho nhiều nền tảng hoặc chế độ biên dịch.

Ví dụ sau đây khai báo các nguồn khác nhau cho các cấu trúc mục tiêu khác nhau. Việc chạy bazel build :multiplatform_lib --cpu x86 sẽ tạo mục tiêu bằng x86_impl.cc, trong khi việc thay thế --cpu arm sẽ khiến mục tiêu sử dụng arm_impl.cc.

cc_library(
    name = "multiplatform_lib",
    srcs = select({
        ":x86_mode": ["x86_impl.cc"],
        ":arm_mode": ["arm_impl.cc"]
    })
)
config_setting(
    name = "x86_mode",
    values = { "cpu": "x86" }
)
config_setting(
    name = "arm_mode",
    values = { "cpu": "arm" }
)

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 (về mặt kỹ thuật, giữa giai đoạn tải và phân tích). Mọi hoạt động xử lý trước khi đánh giá select() đều không biết select() chọn nhánh nào. Ví dụ: các macro không thể thay đổi hành vi của chúng dựa trên nhánh đã chọn và bazel query chỉ có thể dự đoán một cách thận trọng về các phần phụ thuộc có thể định cấu hình của một mục tiêu. Hãy xem câu hỏi thường gặp này để biết thêm thông tin về cách sử dụng select() với các quy tắc và macro.

Các thuộc tính được đánh dấu là nonconfigurable trong tài liệu của chúng không thể sử dụng tính năng này. Thông thường, một thuộc tính không thể định cấu hình được vì Bazel cần biết giá trị của thuộc tính đó trong nội bộ trước khi có thể xác định cách phân giải select().

Hãy xem phần Thuộc tính bản dựng có thể định cấu hình để biết thông tin tổng quan chi tiết.

Mục tiêu đầu ra ngầm ẩn

Không dùng đầu ra ngầm ẩn trong C++ nữa. Vui lòng không sử dụng tên này bằng các ngôn ngữ khác nếu có thể. Chúng tôi chưa có lộ trình ngừng sử dụng nhưng cuối cùng các lớp này cũng sẽ ngừng hoạt động.

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. Ví dụ: khi khai báo rõ ràng một quy tắc java_binary(name='foo', ...), bạn cũng ngầm ẩn khai báo mục tiêu tệp đầu ra foo_deploy.jar là một thành viên của cùng một gói. (Mục tiêu cụ thể này là một tệp lưu trữ Java độc lập phù hợp với việc triển khai.)

Mục tiêu đầu ra ngầm ẩn là các thành viên hạng nhất của đồ thị 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, khi được chỉ định trong lệnh tạo cấp cao nhất hoặc khi là điều kiện tiên quyết cần thiết cho các mục tiêu bản dựng khác. 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.

Đối với mỗi loại quy tắc bản dựng, tài liệu của quy tắc đó sẽ chứa một phần đặc biệt nêu chi tiết tên và nội dung của mọi đầu ra ngầm ẩn bắt buộc phải có trong phần khai báo loại quy tắc đó.

Một điểm khác biệt quan trọng nhưng hơi khó nhận ra giữa hai không gian tên mà hệ thống xây dựng sử dụng: thẻ xác định mục tiêu, có thể là quy tắc hoặc tệp, và mục tiêu tệp có thể được chia thành mục tiêu tệp nguồn (hoặc đầu vào) và mục tiêu tệp phái sinh (hoặc đầu ra). Đây là những điều bạn có thể đề cập trong tệp BUILD, tạo từ dòng lệnh hoặc kiểm tra bằng bazel query; đây là không gian tên mục tiêu. Mỗi mục tiêu tệp tương ứng với một tệp thực tế trên đĩa ("không gian tên hệ thống tệp"); mỗi mục tiêu quy tắc có thể tương ứng với 0, 1 hoặc nhiều tệp thực tế trên đĩa. Có thể có các tệp trên ổ đĩa không có mục tiêu tương ứng; ví dụ: không thể tham chiếu các tệp đối tượng .o được tạo trong quá trình biên dịch C++ từ trong các tệp BUILD hoặc từ dòng lệnh. Bằng cách này, công cụ xây dựng có thể ẩn một số thông tin triển khai nhất định về cách thực hiện công việc. Điều này được giải thích đầy đủ hơn trong Tài liệu tham khảo về khái niệm BUILD.