Quy tắc Sử dụng bộ sưu tập để sắp xếp ngăn nắp các trang Lưu và phân loại nội dung dựa trên lựa chọn ưu tiên của bạn.

Tạo quy tắc

Trong tệp .bzl, hãy dùng hàm rule để xác định một quy tắc mới và lưu trữ kết quả trong một biến chung. Lệnh gọi đến rule chỉ định các thuộc tính và một hàm triển khai:Thao tác này xác định một loại quy tắc có tên là example_library.Lệnh gọi đến rule cũng phải chỉ định xem quy tắc có tạo đầu ra có thể thực thi (với executable = True) hay cụ thể là một tệp thực thi kiểm thử (với test = True). Nếu là tệp thực thi kiểm thử, thì quy tắc này là một quy tắc kiểm thử và tên của quy tắc phải kết thúc bằng _test.

Đọc thêm

Hoạt động khởi tạo mục tiêu

Bạn có thể tải và gọi các quy tắc trong tệp BUILD:Mỗi lệnh gọi đến một quy tắc xây dựng đều không trả về giá trị nào, nhưng có tác dụng phụ là xác định một mục tiêu. Hành động này được gọi là khởi tạo quy tắc. Thao tác này chỉ định tên cho mục tiêu mới và các giá trị cho thuộc tính của mục tiêu.Bạn cũng có thể gọi các quy tắc từ các hàm Starlark và tải trong các tệp .bzl. Các hàm Starlark gọi các quy tắc được gọi là macro Starlark. Cuối cùng, các macro Starlark phải được gọi từ các tệp BUILD và chỉ có thể được gọi trong giai đoạn tải, khi các tệp BUILD được đánh giá để tạo thực thể cho các mục tiêu.

Đọc thêm

Thuộc tính

Thuộc tính là một đối số quy tắc. Các thuộc tính có thể cung cấp các giá trị cụ thể cho việc triển khai của mục tiêu hoặc có thể tham chiếu đến các mục tiêu khác, tạo ra một biểu đồ các phần phụ thuộc.Các thuộc tính dành riêng cho quy tắc, chẳng hạn như srcs hoặc deps, được xác định bằng cách truyền một bản đồ từ tên thuộc tính đến các giản đồ (được tạo bằng mô-đun attr) đến tham số attrs của rule. Các thuộc tính phổ biến, chẳng hạn như name và visibility, được thêm ngầm vào tất cả các quy tắc. Các thuộc tính bổ sung được thêm ngầm vào các quy tắc thực thi và kiểm thử một cách cụ thể. Bạn không thể thêm các thuộc tính được thêm ngầm vào một quy tắc vào từ điển được truyền đến attrs.

Đọc thêm

Thuộc tính phần phụ thuộc

Các quy tắc xử lý mã nguồn thường xác định các thuộc tính sau để xử lý nhiều loại phần phụ thuộc:Đây là các ví dụ về thuộc tính phần phụ thuộc. Mọi thuộc tính chỉ định nhãn đầu vào (những nhãn được xác định bằng attr.label_list, attr.label hoặc attr.label_keyed_string_dict) đều chỉ định các phần phụ thuộc thuộc một loại nhất định giữa một đích và các đích có nhãn (hoặc các đối tượng Label tương ứng) được liệt kê trong thuộc tính đó khi đích được xác định. Kho lưu trữ và có thể là đường dẫn cho các nhãn này được phân giải tương ứng với mục tiêu đã xác định.Trong ví dụ này, other_target là một phần phụ thuộc của my_target, do đó, other_target được phân tích trước. Đây là lỗi nếu có một chu kỳ trong biểu đồ phần phụ thuộc của các mục tiêu.

Đọc thêm

Thuộc tính riêng tư và các phần phụ thuộc ngầm

Thuộc tính phần phụ thuộc có giá trị mặc định sẽ tạo ra một phần phụ thuộc ngầm. Đây là một phần ngầm định vì nó là một phần của biểu đồ đích mà người dùng không chỉ định trong tệp BUILD. Các phần phụ thuộc ngầm định rất hữu ích khi mã hoá cứng mối qu...

Đọc thêm

Thuộc tính đầu ra

Thuộc tính đầu ra, chẳng hạn như attr.output và attr.output_list, khai báo một tệp đầu ra mà mục tiêu tạo ra. Các thuộc tính này khác với thuộc tính phụ thuộc ở hai điểm:Thông thường, các thuộc tính đầu ra chỉ được dùng khi một quy tắc cần tạo đầu ra có tên do người dùng xác định mà không thể dựa trên tên mục tiêu. Nếu một quy tắc có một thuộc tính đầu ra, thì thuộc tính đó thường có tên là out hoặc outs.Thuộc tính đầu ra là cách ưu tiên để tạo đầu ra được khai báo trước, có thể phụ thuộc cụ thể vào hoặc được yêu cầu tại dòng lệnh.

Đọc thêm

Hàm triển khai

Mỗi quy tắc đều yêu cầu một hàm implementation. Các hàm này được thực thi nghiêm ngặt trong giai đoạn phân tích và chuyển đổi biểu đồ mục tiêu được tạo trong giai đoạn tải thành biểu đồ hành động sẽ được thực hiện trong giai đoạn thực thi. Do đó, các hàm triển khai không thể đọc hoặc ghi tệp.Các hàm triển khai quy tắc thường là riêng tư (được đặt tên bằng dấu gạch dưới ở đầu). Theo quy ước, chúng được đặt tên giống như quy tắc của chúng, nhưng có thêm hậu tố _impl.Các hàm triển khai chỉ nhận đúng một tham số: ngữ cảnh quy tắc, theo quy ước có tên là ctx. Chúng trả về danh sách nhà cung cấp.

Đọc thêm

Mục tiêu

Các phần phụ thuộc được biểu thị tại thời điểm phân tích dưới dạng các đối tượng Target. Các đối tượng này chứa các trình cung cấp được tạo khi hàm triển khai của mục tiêu được thực thi.ctx.attr có các trường tương ứng với tên của từng thuộc tính phần...

Đọc thêm

Tệp

Các tệp được biểu thị bằng các đối tượng File. Vì Bazel không thực hiện thao tác I/O tệp trong giai đoạn phân tích, nên bạn không thể dùng các đối tượng này để đọc hoặc ghi trực tiếp nội dung tệp. Thay vào đó, chúng được truyền đến các hàm phát hành hà...

Đọc thêm

Khai báo đầu ra

Trong giai đoạn phân tích, hàm triển khai của một quy tắc có thể tạo ra các kết quả đầu ra. Vì tất cả nhãn phải được biết trong giai đoạn tải, nên các đầu ra bổ sung này không có nhãn. Bạn có thể tạo các đối tượng File cho đầu ra bằng cách sử dụng ctx.actions.declare_file và ctx.actions.declare_directory. Thông thường, tên của các đầu ra dựa trên tên của mục tiêu, ctx.label.name:Đối với đầu ra được khai báo trước, chẳng hạn như những đầu ra được tạo cho thuộc tính đầu ra, thay vào đó, bạn có thể truy xuất các đối tượng File từ các trường tương ứng của ctx.outputs.

Đọc thêm

Thao tác

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, ví dụ: "chạy gcc trên hello.c và nhận hello.o". Khi một thao tác được tạo, Bazel sẽ không chạy lệnh ngay lập tức. Nó đăng ký trong biểu đồ phần phụ thuộc, vì một thao tác có thể ph...

Đọc thêm

Nhà cung cấp

Trình cung cấp là những phần thông tin mà một quy tắc hiển thị cho các quy tắc khác phụ thuộc vào quy tắc đó. Dữ liệu này có thể bao gồm các tệp đầu ra, thư viện, tham số để truyền trên dòng lệnh của một công cụ hoặc bất kỳ thông tin nào khác mà người dù...

Đọc thêm

Đầu ra mặc định

Đầu ra mặc định của mục tiêu là đầu ra được yêu cầu theo mặc định khi mục tiêu được yêu cầu để tạo bản dựng tại dòng lệnh. Ví dụ: đích java_library //pkg:foo có foo.jar làm đầu ra mặc định, do đó, đích này sẽ được tạo bằng lệnh bazel build //pkg:foo.Đầu ra mặc đị...

Đọc thêm

Runfiles

Runfile là một tập hợp các tệp mà mục tiêu sử dụng trong thời gian chạy (khác với thời gian tạo bản dựng). Trong giai đoạn thực thi, Bazel sẽ tạo một cây thư mục chứa các symlink trỏ đến runfile. Thao tác này dàn xếp môi trường cho tệp nhị phân để tệ...

Đọc thêm

Nhà cung cấp tuỳ chỉnh

Bạn có thể xác định nhà cung cấp bằng hàm provider để truyền tải thông tin cụ thể theo quy tắc:Sau đó, các hàm triển khai quy tắc có thể tạo và trả về các thực thể của trình cung cấp:

Đọc thêm
Khởi chạy tuỳ chỉnh các trình cung cấp

Bạn có thể bảo vệ quá trình tạo thực thể của một trình cung cấp bằng logic tiền xử lý và xác thực tuỳ chỉnh. Bạn có thể dùng cách này để đảm bảo rằng tất cả các thực thể nhà cung cấp đều đáp ứng một số bất biến nhất định hoặc để cung cấp cho người dù...

Đọc thêm

Quy tắc có thể thực thi và quy tắc kiểm thử

Các quy tắc có thể thực thi xác định những mục tiêu có thể được gọi bằng lệnh bazel run. Quy tắc kiểm thử là một loại quy tắc thực thi đặc biệt mà các mục tiêu của quy tắc này cũng có thể được gọi bằng lệnh bazel test. Bạn có thể tạo quy tắc có thể th...

Đọc thêm

Vị trí của tệp runfile

Khi một mục tiêu thực thi được chạy bằng bazel run (hoặc test), gốc của thư mục runfiles sẽ nằm cạnh tệp thực thi. Các đường dẫn liên quan như sau:Đường dẫn đến File trong thư mục runfiles tương ứng với File.short_path.Tệp nhị phân do bazel thực thi t...

Đọc thêm

Chủ đề nâng cao

Đọc thêm

Yêu cầu tệp đầu ra

Một đích đến có thể có nhiều tệp đầu ra. Khi lệnh bazel build được chạy, một số đầu ra của các mục tiêu được đưa ra cho lệnh này sẽ được coi là được yêu cầu. Bazel chỉ tạo những tệp được yêu cầu này và những tệp mà chúng phụ thuộc trực tiếp hoặc gián ti...

Đọc thêm

Cấu hình

Hãy tưởng tượng rằng bạn muốn tạo một tệp nhị phân C++ cho một cấu trúc khác. Quy trình tạo có thể phức tạp và bao gồm nhiều bước. Một số tệp nhị phân trung gian, chẳng hạn như trình biên dịch và trình tạo mã, phải chạy trên nền tảng thực thi (có thể là...

Đọc thêm

Mảnh cấu hình

Các quy tắc có thể truy cập vào các mảnh cấu hình, chẳng hạn như cpp và java. Tuy nhiên, bạn phải khai báo tất cả các mảnh bắt buộc để tránh lỗi truy cập:

Đọc thêm

Đường liên kết tượng trưng Runfiles

Thông thường, đường dẫn tương đối của một tệp trong cây runfiles giống với đường dẫn tương đối của tệp đó trong cây nguồn hoặc cây đầu ra được tạo. Nếu cần phải thay đổi các giá trị này vì một lý do nào đó, bạn có thể chỉ định đối số root_symlinks ho...

Đọc thêm

Mức độ sử dụng mã

Khi lệnh coverage được chạy, bản dựng có thể cần thêm công cụ đo lường mức độ phù hợp cho một số mục tiêu nhất định. Bản dựng cũng thu thập danh sách các tệp nguồn được đo lường. Tập hợp con của các mục tiêu được xem xét do cờ -instrumentation_filter ki...

Đọc thêm

Kiểm thử quy tắc

Các quy tắc kiểm thử cần có chế độ thiết lập bổ sung để tạo báo cáo về mức độ phù hợp. Bản thân quy tắc phải thêm các thuộc tính ngầm sau:Bằng cách sử dụng configuration_field, bạn có thể tránh được sự phụ thuộc vào công cụ hợp nhất LCOV của Java miễn là bạn không yêu cầu phạm vi.Khi chạy, kiểm thử sẽ phát ra thông tin về mức độ phù hợp dưới dạng một hoặc nhiều tệp LCOV có tên riêng biệt vào thư mục do biến môi trường COVERAGE_DIR chỉ định. Sau đó, Bazel sẽ hợp nhất các tệp này thành một tệp LCOV duy nhất bằng công cụ _lcov_merger. Nếu có, công cụ này cũng sẽ thu thập mức độ phù hợp của C/C++ bằng công cụ _collect_cc_coverage.

Đọc thêm

Mức độ bao phủ cơ sở

Vì mức độ sử dụng chỉ được thu thập cho mã nằm trong cây phần phụ thuộc của một kiểm thử, nên báo cáo về mức độ sử dụng có thể gây hiểu lầm vì không nhất thiết phải bao gồm tất cả mã khớp với cờ -instrumentation_filter.Vì lý do này, Bazel cho phép các ...

Đọc thêm

Hành động xác thực

Đôi khi, bạn cần xác thực một số thông tin về bản dựng và thông tin cần thiết để thực hiện quy trình xác thực đó chỉ có trong các cấu phần phần mềm (tệp nguồn hoặc tệp được tạo). Vì thông tin này nằm trong các cấu phần phần mềm, nên các quy tắc không th...

Đọc thêm

Nhóm đầu ra xác thực

Nhóm đầu ra xác thực là một nhóm đầu ra được thiết kế để giữ các đầu ra không dùng đến của các thao tác xác thực, để không cần phải thêm các đầu ra này một cách nhân tạo vào đầu vào của các thao tác khác.Nhóm này đặc biệt ở chỗ các đầu ra của nhóm luôn...

Đọc thêm

Sử dụng Nhóm đầu ra xác thực

Nhóm đầu ra xác thực có tên là _validation và được dùng như mọi nhóm đầu ra khác:Lưu ý rằng tệp đầu ra xác thực không được thêm vào DefaultInfo hoặc đầu vào cho bất kỳ thao tác nào khác. Thao tác xác thực cho đích của loại quy tắc này vẫn sẽ chạy nếu ...

Đọc thêm

Cờ thao tác xác thực

Việc chạy các thao tác xác thực được kiểm soát bằng cờ dòng lệnh -run_validations, theo mặc định là true.

Đọc thêm

Những tính năng đã ngừng hoạt động

Đọc thêm

Đầu ra được khai báo trước không được dùng nữa

Có 2 cách không dùng nữa để sử dụng các đầu ra được khai báo trước:

Đọc thêm

Các tính năng runfile cần tránh

ctx.runfiles và loại runfiles có một bộ tính năng phức tạp, nhiều tính năng trong số đó được giữ lại vì lý do kế thừa. Các đề xuất sau đây giúp giảm độ phức tạp:

Đọc thêm

Di chuyển từ các nhà cung cấp cũ

Trước đây, các nhà cung cấp Bazel là các trường đơn giản trên đối tượng Target. Chúng được truy cập bằng toán tử dấu chấm và được tạo bằng cách đặt trường trong struct do hàm triển khai của quy tắc trả về thay vì danh sách các đối tượng nhà cung cấp:Bạn có thể tr...

Đọc thêm

Bạn đã thích câu chuyện này ?

Hãy chia sẻ bằng cách nhấn vào nút bên trên

Truy cập trang web của chúng tôi và xem tất cả các bài viết khác!

CLTM