Kho lưu trữ, không gian làm việc, gói và mục tiêu

Báo cáo sự cố Xem nguồn

Bazel xây dựng phần mềm từ mã nguồn được sắp xếp trong cây thư mục gọi là kho lưu trữ. Một nhóm kho lưu trữ được xác định sẽ bao gồm không gian làm việc. Các tệp nguồn trong kho lưu trữ được sắp xếp theo hệ phân cấp gói lồng nhau, trong đó mỗi gói là một thư mục chứa một tập hợp các tệp nguồn có liên quan và một tệp BUILD. Tệp BUILD chỉ định các đầu ra phần mềm có thể được tạo từ nguồn.

Kho lưu trữ

Các tệp nguồn dùng trong bản dựng Bazel được sắp xếp trong kho lưu trữ (thường được rút ngắn thành repos). Kho lưu trữ là một cây thư mục có tệp đánh dấu ranh giới ở gốc; tệp đánh dấu ranh giới như vậy có thể là MODULE.bazel, REPO.bazel hoặc trong ngữ cảnh cũ, WORKSPACE hoặc WORKSPACE.bazel.

Kho lưu trữ mà trong đó lệnh Bazel hiện tại đang chạy được gọi là kho lưu trữ chính. Các kho lưu trữ khác (bên ngoài) được xác định theo các quy tắc kho lưu trữ; hãy xem bài viết tổng quan về các phần phụ thuộc bên ngoài để biết thêm thông tin.

Workspace

Không gian làm việc là môi trường dùng chung cho tất cả các lệnh Bazel chạy từ cùng một kho lưu trữ chính. Kho lưu trữ này bao gồm kho lưu trữ chính và tập hợp tất cả các kho lưu trữ bên ngoài đã xác định.

Xin lưu ý rằng trước đây, các khái niệm về "kho lưu trữ" và "không gian làm việc" đã kết hợp với nhau. "Không gian làm việc" thường được dùng để chỉ kho lưu trữ chính, và đôi khi còn được dùng làm từ đồng nghĩa với "kho lưu trữ".

Gói

Đơn vị chính của việc sắp xếp mã trong kho lưu trữ là gói. Gói là một tập hợp các tệp có liên quan và thông số kỹ thuật về cách sử dụng các tệp đó để tạo cấu phần phần mềm đầu ra.

Gói được định nghĩa là một thư mục chứa tệp BUILD có tên BUILD hoặc BUILD.bazel. Một gói bao gồm tất cả các tệp trong thư mục đó, cùng với tất cả các thư mục con bên dưới gói đó, trừ những thư mục con chứa tệp BUILD. Từ định nghĩa này, không tệp hoặc thư mục nào có thể là một phần của hai gói khác nhau.

Ví dụ: trong cây thư mục sau đây, có 2 gói là my/app và gói con my/app/tests. Lưu ý my/app/data không phải là một gói mà là một thư mục thuộc gói my/app.

src/my/app/BUILD
src/my/app/app.cc
src/my/app/data/input.txt
src/my/app/tests/BUILD
src/my/app/tests/test.cc

Mục tiêu

Gói là một vùng chứa mục tiêu, được xác định trong tệp BUILD của gói. Hầu hết các mục tiêu đều là một trong hai loại chính: tệpquy tắc.

Các tệp được chia thành hai loại. Tệp nguồn thường được viết bởi nỗ lực của mọi người và được đăng nhập vào kho lưu trữ. Các tệp đã tạo, đôi khi được gọi là tệp dẫn xuất hoặc tệp đầu ra, không được đánh dấu vào mà được tạo từ các tệp nguồn.

Loại mục tiêu thứ hai được khai báo bằng quy tắc. Mỗi thực thể quy tắc chỉ định mối quan hệ giữa một tập hợp đầu vào và một tập hợp tệp đầu ra. Dữ liệu đầu vào cho một quy tắc có thể là tệp nguồn, nhưng cũng có thể là kết quả của các quy tắc khác.

Cho dù dữ liệu đầu vào cho một quy tắc là tệp nguồn hay tệp được tạo trong hầu hết các trường hợp, thì điều quan trọng chỉ là nội dung của tệp đó. Thực tế này giúp bạn dễ dàng thay thế một tệp nguồn phức tạp bằng một tệp được tạo theo quy tắc, chẳng hạn như xảy ra khi gánh nặng việc duy trì một tệp có cấu trúc cao theo cách thủ công trở nên quá mệt mỏi và ai đó phải viết một chương trình để lấy tệp đó. Người dùng tệp đó không cần thay đổi gì. Ngược lại, tệp đã tạo có thể dễ dàng được thay thế bằng tệp nguồn chỉ có các thay đổi cục bộ.

Dữ liệu đầu vào cho một quy tắc cũng có thể bao gồm các quy tắc khác. Ý nghĩa chính xác của các mối quan hệ như vậy thường khá phức tạp và phụ thuộc vào ngôn ngữ, nhưng theo trực quan thì rất đơn giản: một quy tắc thư viện C++ A có thể có một quy tắc B khác cho thư viện C++ cho dữ liệu đầu vào. Tác động của phần phụ thuộc này là các tệp tiêu đề của B có sẵn cho A trong quá trình biên dịch, các ký hiệu của B có sẵn cho A trong quá trình liên kết và dữ liệu thời gian chạy của B có sẵn cho A trong quá trình thực thi.

Bất biến của tất cả các quy tắc là các tệp do quy tắc tạo ra luôn thuộc cùng một gói và chính quy tắc đó; không thể tạo các tệp vào một gói khác. Tuy nhiên, thông tin đầu vào của quy tắc đến từ một gói khác là điều bình thường.

Nhóm gói là các tập hợp các gói có mục đích giới hạn khả năng truy cập của một số quy tắc nhất định. Nhóm gói được xác định bằng hàm package_group. Các gói này có 3 thuộc tính: danh sách các gói chứa trong đó, tên và các nhóm gói khác có trong gói. Bạn chỉ được phép tham chiếu đến các biến này từ thuộc tính visibility của các quy tắc hoặc từ thuộc tính default_visibility của hàm package; chúng không tạo hoặc sử dụng tệp. Để biết thêm thông tin, hãy tham khảo tài liệu về package_group.

Nhãn