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

Báo cáo vấn đề Xem nguồn Nightly · 7.4 .

Bazel tạo phần mềm từ mã nguồn được sắp xếp trong các cây thư mục có tên là kho lưu trữ. Không gian làm việc bao gồm một tập hợp các kho lưu trữ được xác định. Các tệp nguồn trong kho lưu trữ được sắp xếp theo hệ phân cấp lồng nhau của các gói, 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 những đầ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 một bản dựng Bazel được sắp xếp trong kho lưu trữ (thường được viết tắt thành repos). Kho lưu trữ là một cây thư mục có tệp điểm đánh dấu ranh giới ở thư mục gốc; tệp điểm đánh dấu ranh giới đó có thể là MODULE.bazel, REPO.bazel hoặc trong ngữ cảnh cũ, WORKSPACE hoặc WORKSPACE.bazel.

Kho lưu trữ mà 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ữ (bên ngoài) khác được xác định theo quy tắc kho lưu trữ; hãy xem phần tổng quan về 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 mà tất cả các lệnh Bazel chạy từ cùng một kho lưu trữ chính dùng chung. Tệp 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 "kho lưu trữ" và "không gian làm việc" đã bị lẫn lộn; thuật ngữ "không gian làm việc" thường được dùng để chỉ kho lưu trữ chính và đôi khi thậm chí còn được dùng làm từ đồng nghĩa của "kho lưu trữ".

Gói

Đơn vị chính để 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 xác định là một thư mục chứa tệp BUILD có tên là BUILD hoặc BUILD.bazel. Một gói bao gồm tất cả các tệp trong thư mục của gói đó, cùng với tất cả thư mục con bên dưới, ngoại trừ những thư mục chứa tệp BUILD. Theo định nghĩa này, không có tệp hoặc thư mục nào có thể thuộc hai gói khác nhau.

Ví dụ: trong cây thư mục sau đây, có hai gói là my/app và gói con my/app/tests. Xin 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à 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 thuộc một trong hai loại chính là 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ằng nỗ lực của mọi người và được kiểm tra vào kho lưu trữ. Tệp đã tạo, đôi khi được gọi là tệp phái sinh hoặc tệp đầu ra, không được đăng ký 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 một 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 tệp đầu vào và một tập hợp tệp đầu ra. Giá trị đầu vào của một quy tắc có thể là tệp nguồn, nhưng cũng có thể là đầu ra của các quy tắc khác.

Trong hầu hết các trường hợp, việc đầu vào của một quy tắc là tệp nguồn hay tệp được tạo đều không quan trọng; điều quan trọng chỉ là nội dung của tệp đó. Điều này giúp bạn dễ dàng thay thế tệp nguồn phức tạp bằng tệp được tạo bằng một quy tắc, chẳng hạn như khi gánh nặng duy trì tệp có cấu trúc phức tạp theo cách thủ công trở nên quá mệt mỏi và ai đó 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 được 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 của 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ữ hoặc quy tắc, nhưng về trực quan, ý nghĩa này rất đơn giản: quy tắc thư viện C++ A có thể có một quy tắc thư viện C++ B khác cho dữ liệu đầu vào. Hiệu ứ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.

Một hằng số của tất cả các quy tắc là các tệp do một quy tắc tạo ra luôn thuộc cùng một gói với chính quy tắc đó; không thể tạo tệp vào một gói khác. Tuy nhiên, không có gì lạ khi dữ liệu đầu vào của một quy tắc đến từ một gói khác.

Nhóm gói là tập hợp các gói có mục đích giới hạn khả năng hỗ trợ tiếp cận 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 đối tượng 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 đó. Cách duy nhất được phép để tham chiếu đến các tệp này là từ thuộc tính visibility của quy tắc hoặc từ thuộc tính default_visibility của hàm package; các tệp này không tạo hoặc tiêu thụ tệp. Để biết thêm thông tin, hãy tham khảo tài liệu về package_group.

Nhãn