Định nghĩa phổ biến

Phần này định nghĩa 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á vỏ Bourne

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

Các thuộc tính chịu sự điều chỉnh của mã thông báo này sẽ được nêu rõ trong phần định nghĩa của các thuộc tính đó.

Các thuộc tính có thể mở rộng biến "Make" và mã hoá shell Bourne 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 này là cc_library.coptsjava_library.javacopts. Các phương pháp thay thế này cho phép một biến chuỗi đơn mở rộng thành danh sách các từ tuỳ chọn theo cấu hình cụ thể.

Mở rộng nhãn

Một số thuộc tính chuỗi của một số rất ít quy tắc có thể mở rộng nhãn: nếu các chuỗi đó chứa nhãn hợp lệ dưới dạng 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 tên đường dẫn của tệp được đại diện bởi //mypkg:target mục tiêu.

Ví dụ về các thuộc tính bao gồm genrule.cmdcc_binary.linkopts. Thông tin có thể thay đổi đáng kể trong từng trường hợp, về các vấn đề như: các nhãn tương đối có được mở rộng hay không, cách xử lý các nhãn mở rộng ra nhiều tệp, v.v. Hãy tham khảo tài liệu về thuộc tính của quy tắc để biết các thông tin cụ thể.

Các thuộc tính điển hình được xác định theo hầu hết các quy tắc tạo bản dựng

Phần này mô tả các thuộc tính được xác định theo nhiều quy tắc tạo bản dựng, nhưng không phải tất cả.

Thuộc tính Nội dung mô tả
data

List of labels ; optional

Số tệp cần thiết cho quy tắc này vào thời gian chạy. Có thể liệt kê các mục tiêu quy tắc hoặc tệp. Thường cho phép mục tiêu bất kỳ.

Các đầu ra mặc định và tệp chạy của mục tiêu trong thuộc tính data sẽ xuất hiện trong khu vực *.runfiles của bất kỳ tệp thực thi nào xuất ra bởi hoặc có phần phụ thuộc thời gian chạy trên mục tiêu này. Trong đó có thể bao gồm các tệp dữ liệu hoặc tệp nhị phân được dùng khi thực thi srcs của mục tiêu này. Hãy xem phần các phần phụ thuộc của 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 sẽ xác định thuộc tính data nếu các quy tắc đó 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 của các quy tắc cũng phải điền sẵn tệp chạy của mục tiêu qua dữ liệu đầu ra và tệp chạy của bất kỳ thuộc tính data nào, cũng như các 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

List of labels ; optional

Phần phụ thuộc cho mục tiêu này. Thường thì bạn chỉ nên liệt kê các mục tiêu quy tắc. (Mặc dù một số quy tắc cho phép các tệp được liệt kê trực tiếp trong deps, nhưng bạn nên tránh điều này khi có thể.)

Các quy tắc theo ngôn ngữ 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 về ý nghĩa của việc một mục tiêu phụ thuộc vào một mục tiêu khác 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ẽ đi sâu 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 biểu tượng đượ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. Các phần phụ thuộc nhiều ngôn ngữ cũng được cho phép trong nhiều trường hợp: Chẳng hạn, một 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ề các phần phụ thuộc để biết thêm thông tin.

licenses

List of strings; optional; nonconfigurable

Danh sách các chuỗi loại giấy phép sẽ được 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

List of labels ; optional

Tệp được xử lý hoặc đưa vào quy tắc này. Thường thì trực tiếp liệt kê 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 dữ liệu đầu ra mặc định của chúng.

Các quy tắc theo ngôn ngữ cụ thể thường yêu cầu các tệp được liệt kê phải có đuôi tệp cụ thể.

Thuộc tính chung cho tất cả quy tắc xây dựng

Phần này mô tả các thuộc tính được ngầm thêm vào tất cả các quy tắc xây dựng.

Thuộc tính Nội dung mô tả
compatible_with

List of labels ; optional; nonconfigurable

Danh sách 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 trong hệ thống ràng buộc của Bazel, cho phép người dùng khai báo các mục tiêu nào có thể và không thể phụ thuộc lẫn nhau. Ví dụ: các tệp nhị phân có thể triển khai bên ngoài không nên phụ thuộc vào thư viện có mã bí mật của công ty. Hãy xem ConstraintSemantics (Ngữ nghĩa ràng buộc) để biết thông tin chi tiết.

deprecation

String; optional; nonconfigurable

Thông báo cảnh báo giải thích về mục tiêu này. Thường thì thuộc tính này 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ị thay thế bằng một quy tắc khác, là mục tiêu riêng tư đối với một gói hoặc có thể bị coi là có hại vì lý do nào đó. Bạn nên đưa vào một số tệp tham chiếu (chẳng hạn như trang web, số lỗi hoặc ví dụ về CL di chuyển) để có thể dễ dàng tìm ra những thay đổi cần thiết để tránh thông báo. Nếu có mục tiêu mới có thể dùng làm mục tiêu thay thế, thì 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 mọi thứ, nhưng có thể ảnh hưởng đến kết quả chẩn đoán của công cụ xây dựng. Công cụ bản dựng sẽ đưa ra cảnh báo khi một quy tắc có thuộc tính deprecation phụ thuộc vào một mục tiêu trong một gói khác.

Các phần phụ thuộc trong gói được miễn khỏi cảnh báo này để chẳng hạn như việc tạo kiểm thử của một quy tắc không dùng nữa sẽ không gặp phải 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ác đã ngừng sử dụng, thì sẽ không có thông báo cảnh báo nào được đưa ra.

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

distribs

List of strings; optional; nonconfigurable

Danh sách các chuỗi phương thức phân phối được 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

List of labels ; optional; nonconfigurable

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 bổ sung cho mọi quy tắc ràng buộc đã đặt theo loại quy tắc. Giới hạn đượ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 chi tiết, hãy xem nội dung mô tả về cách phân giải của chuỗi công cụ.

exec_properties

Dictionary of strings; optional

Từ điển gồm các chuỗi sẽ được thêm vào exec_properties của một nền tảng đã chọn cho đích này. Xem exec_properties trong quy tắc về nền tảng.

Nếu có một khoá trong cả tài sản cấp mục tiêu và nền tảng, thì giá trị sẽ được lấy từ mục tiêu.

features

List of feature strings; optional

Tính năng là thẻ chuỗi có thể bật hoặc tắt trên 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"], các tính năng được bật cho quy tắc sẽ là "b" và "c". Xem ví dụ.

restricted_to

List of labels ; optional; nonconfigurable

Danh sách môi trường có thể tạo mục tiêu này, thay vì môi trường được hỗ trợ mặc định.

Đây là một phần trong hệ thống ràng buộc của Bazel. Hãy truy cập vào compatible_with để biết thông tin chi tiết.

tags

List of strings; optional; nonconfigurable

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à quy tắc test_suite rất hữu ích cho việc phân loại các lượt kiểm thử. Thẻ trên các mục tiêu không kiểm thử được dùng để kiểm soát quá trình thực thi hộp cát của các hành động genruleStarlark, cũng như để phân tích cú pháp của 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 mục tiêu genrule hoặc kiểm thử bất kỳ, hoặc nếu thấy các khoá của execution_requirements cho bất kỳ thao tác Starlark nào.

  • Từ khoá no-sandbox dẫn đến hành động hoặc bài kiểm thử không bao giờ bị tạo hộp cát; nó 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 một hoặc cả hai điều này.
  • Từ khoá no-cache dẫn đế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 dẫn đến hành động hoặc hoạt động kiểm thử không bao giờ được lưu từ xa vào bộ nhớ đệm (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 ý: vì mục đích của thẻ này, bộ nhớ đệm của ổ đĩa được coi là bộ nhớ đệm cục bộ, trong khi bộ nhớ đệm http và gRPC được coi là bộ nhớ đệm từ xa. Nếu bạn chỉ định bộ nhớ đệm kết hợp (tức là bộ nhớ đệm có các thành phần cục bộ và từ xa), thì bộ nhớ đệm đó 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 đó, các thành phần cục bộ sẽ được sử dụng.
  • Từ khoá no-remote-exec dẫn đến hành động hoặc hoạt động 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 thực thi hành động hoặc bài kiểm thử 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 vô hiệu hoá việc tải một phần của quy trình lưu trứng vào bộ nhớ đệm từ xa vào bộ nhớ đệm. thao tác này sẽ không tắt tính năng thực thi từ xa.
  • Từ khoá local ngăn hành động hoặc hoạt động 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 quy tắc tạo 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 hộp cát được bậ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 localhost. Thẻ này chỉ có hiệu lực nếu hộp cát được bậ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 hoạt động kiểm thử thường được dùng để chú thích vai trò của hoạt động kiểm thử trong quy trình gỡ lỗi và phát hành. Thông thường, thẻ hữu ích nhất cho chương trình kiểm thử C++ và Python, vốn thiếu khả năng chú giải thời gian chạy. Việc sử dụng thẻ và các phần tử kích thước mang lại sự linh hoạt trong việc tập hợp các bộ kiểm thử dựa trên chính sách đăng ký 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 chương trình kiểm thử ở chế độ "độc quyền", đảm bảo rằng không có chương trình kiểm thử nào khác đang chạy cùng lúc. Các hoạt động kiểm thử như vậy sẽ được thực thi theo kiểu nối tiếp sau khi tất cả hoạt động tạo bản dựng và hoạt động kiểm thử không độc quyền đã hoàn tất. Tính năng thực thi từ xa bị vô hiệu hoá đối với các chương trình kiểm thử đó vì Bazel không có quyền kiểm soát nội dung đ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 được thực thi cục bộ, nhưng sẽ chạy kiểm thử song song nếu được thực thi từ xa.
  • Từ khoá manual sẽ loại trừ mục tiêu khỏi việc mở rộng các 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ê kiểm thử một cách rõ ràng 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. Thao tác này không ảnh hưởng đến ký tự đại diện mục tiêu hoặc tính năng mở rộng bộ thử nghiệm trong các ngữ cảnh khác, bao gồm cả lệnh query. Xin lưu ý rằng manual không ngụ ý rằng mục tiêu không được các hệ thống xây dựng/kiểm thử liên tục tạo/chạy tự động. Ví dụ: bạn nên loại trừ một mục tiêu khỏi bazel test ... vì mục tiêu này yêu cầu cờ Bazel cụ thể, nhưng vẫn phải đưa mục tiêu đó vào các lần gửi trước hoặc lần chạy kiểm thử liên tục được định cấu hình đúng cách.
  • Từ khoá external sẽ buộc hoạt động kiểm thử phải được thực thi vô điều kiện (bất kể giá trị --cache_test_results).
Xem Quy ước về thẻ trong Bách khoa toàn thư thử nghiệm để biết thêm quy ước về các thẻ được đính kèm vào mục tiêu thử nghiệm.
target_compatible_with

List of labels ; optional

Danh sách 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. Đây là quy tắc bổ sung cho 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 đã liệt kê, thì mục tiêu sẽ bị coi là incompatible. Các mục tiêu không tương thích sẽ bị bỏ qua để tạo 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 sẽ bị coi là không tương thích. Các cấu phần phần mềm này cũng bị bỏ qua để tạo và kiểm thử.

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

Mọi quy tắc khác ngoài 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ề cách bỏ qua mục tiêu không tương thích.

testonly

Boolean; optional; default False except for test and test suite targets; nonconfigurable

Nếu đúng, thì chỉ những mục tiêu chỉ kiểm thử (chẳng hạn như thử nghiệm) 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 quy trình kiểm thử (quy tắc *_test) và bộ kiểm thử (quy tắc test_suite) sẽ là testonly.

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

Vì chỉ kiểm thử được thực thi tại thời điểm xây dựng, chứ không phải thời gian chạy và truyền mã lực 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ụ: mã giả lập và mã giả mạo hữu ích cho việc kiểm thử đơn vị cũng có thể hữu ích cho các chương trình kiểm thử tích hợp liên quan đến các tệp nhị phân sẽ được phát hành chính thức, do đó, có lẽ không nên được đánh dấu là chỉ kiểm thử. Ngược lại, các quy tắc nguy hiểm khi liên kết (có thể là vì chúng ghi đè hành vi thông thường) vô điều kiện nên được đánh dấu là chỉ dành cho mục đích kiểm thử.

toolchains

List of labels ; optional; nonconfigurable

Tập hợp các mục tiêu có Tạo biến mà mục tiêu này được phép truy cập. Các mục tiêu này là thực thể của các quy tắc cung cấp TemplateVariableInfo hoặc mục tiêu đặc biệt cho các loại chuỗi công cụ được tích hợp trong Bazel. Trong đó có:

  • @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 của chuỗi công cụ được dùng trong các hoạt động triển khai quy tắc cho cấu hình phụ thuộc vào nền tảng. Bạn không thể dùng thuộc tính này để xác định cc_toolchain hoặc java_toolchain cụ thể mà một mục tiêu sẽ sử dụng.

visibility

List of labels ; optional; default default_visibility from package if specified, or //visibility:private otherwise; nonconfigurable

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

Thuộc tính chung cho tất cả quy tắc kiểm thử (*_test)

Phần này mô tả các thuộc tính chung cho tất cả quy tắc kiểm thử.

Thuộc tính Nội dung mô tả
args

List of strings; optional; subject to $(location) and "Make variable" substitution, and Bourne shell tokenization

Các đối số dòng lệnh mà Bazel truyền đến mục tiêu khi thực thi bằng bazel test.

Các đối số này được chuyển trước bất kỳ giá trị --test_arg nào đã chỉ định trên dòng lệnh bazel test.

env

Dictionary of strings; optional; values are subject to $(location) and "Make variable" substitution

Chỉ định các biến môi trường bổ sung để thiết lập khi bazel test thực thi bài kiểm thử.

Thuộc tính này chỉ áp dụng cho các quy tắc gốc, như cc_test, py_testsh_test. Giá trị 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 một thuộc tính "env" và sử dụng thuộc tính này để điền vào Trình cung cấp TestEnvironment (Môi trường kiểm thử).

env_inherit

List of strings; optional

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 bài kiểm thử.

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

size

String "enormous", "large" "medium" or "small", default is "medium"; optional; nonconfigurable

Chỉ định "mức độ nặng" của mục tiêu kiểm thử: thời gian/tài nguyên cần thiết để chạy mục tiêu kiểm thử.

Kiểm thử đơn vị được coi là kiểm thử "nhỏ", kiểm thử tích hợp "trung bình" và kiểm thử toàn diện "lớn" hoặc "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 thuộc tính timeout. Thời gian chờ là thời gian chờ áp dụng cho tất cả các hoạt động kiểm thử trong mục tiêu XÂY DỰNG, chứ không phải cho từng hoạt động kiểm thử riêng lẻ. Khi kiểm thử được chạy cục bộ, size cũng được dùng cho mục đích lên lịch: Bazel cố gắng tôn trọng --local_{ram,cpu}_resources và không làm máy cục bộ bị lấn át bằng cách chạy nhiều kiểm thử nặng cùng lúc.

Kích thước kiểm thử tương ứng với 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 được 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 (5 phút)
lớn 300 1 dài (15 phút)
to 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

String "short", "moderate", "long", "eternal" (with the default derived from the test's size attribute); nonconfigurable

Khoảng thời gian thử nghiệm dự kiến sẽ chạy trước khi quay lại.

Mặc dù thuộc tính kích thước của hoạt động kiểm thử kiểm soát việc ước tính tài nguyên, nhưng thời gian chờ của bài kiểm thử có thể được đặt một cách độc lập. Nếu không được chỉ định rõ ràng, thời gian chờ sẽ dựa trên kích thước 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 được xác định là chậm. Các 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
trung bình 5 phút
long 15 phút
vĩnh viễn 60 phút

Đối với những thời điểm khác, thời gian chờ kiểm thử có thể được ghi đè bằng cờ bazel --test_timeout, chẳng hạn như khi chạy thủ công trong các điều kiện được xác định 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ử là 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 thử nghiệm.

flaky

Boolean; optional; default False; nonconfigurable

Các dấu hiệu kiểm tra là không ổn định.

Nếu được thiết lập, sẽ thực thi kiểm thử tối đa 3 lần và chỉ đánh dấu kiểm thử là không thành công nếu mỗi lần kiểm thử đều thất bại. 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. Lưu ý rằng thường thì bạn không nên sử dụng thuộc tính này – các bài kiểm thử phải truyền một cách đáng tin cậy khi các câu nhận định của chúng được giữ nguyên.

shard_count

Non-negative integer less than or equal to 50; optional

Chỉ định số lượng phân đoạn song song cần sử dụng để chạy kiểm thử.

Giá trị này sẽ ghi đè mọi phương pháp phỏng đoán dùng để xác định số lượng phân đoạn song song cần chạy kiểm thử. Lưu ý rằng đối với một số quy tắc kiểm thử, bạn có thể phải có 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 tính năng phân đoạn kiểm thử đang bật, biến môi trường TEST_TOTAL_SHARDS sẽ được đặt thành giá trị này khi tạo bài 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ể mã này sẽ chạy mọi bài kiểm thử trong mọi phân đoạ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ư kiểm thử để biết thông tin chi tiết về cách phân đoạn.

local

Boolean; default False; nonconfigurable

Buộc chạy thử nghiệm cục bộ mà không tạo 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" dưới dạng thẻ (tags=["local"]).

Các thuộc tính chung cho mọi quy tắc nhị phân (*_nhị phân)

Phần này mô tả thuộc tính chung cho tất cả các quy tắc nhị phân.

Thuộc tính Nội dung mô tả
args

List of strings; optional; subject to $(location) and "Make variable" substitution, and Bourne shell tokenization; nonconfigurable

Các đối số dòng lệnh mà Bazel sẽ truyền đến mục tiêu khi đượ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 những đối số được chỉ định trên dòng lệnh bazel run hoặc bazel test.

LƯU Ý: Các đối số 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

Dictionary of strings; optional; values are subject to $(location) and "Make variable" substitution

Chỉ định các biến môi trường bổ sung để thiết lập 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, như cc_binary, py_binarysh_binary. Chính sách 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

List of strings; optional

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 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. Ví dụ: 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 nhiều nguồn 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 cách sử dụng x86_impl.cc, còn 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ế 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 các giai đoạn tải và phân tích). Mọi quá trình 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 dựa trên nhánh đã chọn và bazel query chỉ có thể đưa ra dự đoán thận trọng về các phần phụ thuộc có thể định cấu hình của mục tiêu. Hãy xem phần 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 tương ứ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 vì nội bộ Bazel cần biết giá trị của thuộc tính đó trước khi có thể xác định cách phân giải select().

Hãy xem 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 kết quả đầu ra ngầm trong C++ nữa. Nếu có thể, vui lòng không dùng thuộc tính này bằng các ngôn ngữ khác. Chúng tôi chưa có lộ trình ngừng sử dụng nhưng sau cùng, chúng cũng sẽ không được dùng nữa.

Khi xác định quy tắc xây dựng trong tệp BUILD, bạn sẽ khai báo rõ ràng mục tiêu quy tắc mới được đặt tên trong gói. Nhiều hàm quy tắc xây dựng cũng ngầm ẩn yêu cầu một hoặc nhiều mục tiêu tệp đầu ra, có nội dung và ý nghĩa riêng theo quy tắc. Ví dụ: khi khai báo rõ ràng quy tắc java_binary(name='foo', ...), bạn cũng sẽ ngầm ẩn khai báo tệp đầu ra mục tiêu foo_deploy.jar là thành phầ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 để triển khai.)

Mục tiêu đầu ra ngầm ẩn là thành phần hạng nhất của biểu đồ mục tiêu toàn cục. Cũng 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 chúng 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 phần phụ thuộc này dưới dạng phần phụ thuộc trong tệp BUILD và bạn có thể quan sát các tài sản này 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 xây dựng, tài liệu của quy tắc chứa một phần đặc biệt nêu chi tiết tên và nội dung của mọi kết quả ngầm ẩn bắt nguồn từ việc khai báo loại quy tắc đó.

Một điểm khác biệt quan trọng nhưng có phần tinh vi giữa 2 không gian tên mà hệ thống xây dựng sử dụng: nhãn xác định mục tiêu (có thể là các 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át sinh (hoặc đầu ra). Bạn có thể đề cập đến những nội dung sau trong các tệp BUILD (Xây dựng) 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 một hoặc nhiều tệp thực 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ụ: các tệp đối tượng .o được tạo trong quá trình biên dịch C++ không thể tham chiếu đượ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 công cụ thực hiện nhiệm vụ. Đ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 về BUILD.