Bazel xây dựng phần mềm từ mã nguồn được sắp xếp trong các cây thư mục gọi là
kho lưu trữ. Một tập hợp kho lưu trữ được xác định 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ệ thống 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 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 xây dựng từ
nguồn.
Kho lưu trữ
Các tệp nguồn được dùng trong bản dựng Bazel được sắp xếp trong kho lưu trữ (thường
được rút gọn thành kho). Kho 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 các ngữ cảnh cũ, WORKSPACE hoặc WORKSPACE.bazel.
Kho mà lệnh Bazel hiện tại đang chạy được gọi là kho chính. Các kho khác (bên ngoài) được xác định theo quy tắc kho; hãy xem phần tổng quan về các phần phụ thuộc bên ngoài để biết thêm thông tin.
Không gian làm việc
Không gian làm việc là môi trường được chia sẻ bởi tất cả các lệnh Bazel chạy từ cùng một kho chính. Không gian này bao gồm kho chính và tập hợp tất cả các kho bên ngoài được xác định.
Xin lưu ý rằng trong lịch sử, các khái niệm về "kho lưu trữ" và "không gian làm việc" đã bị trộ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 dùng làm từ đồng nghĩa của "kho lưu trữ".
Gói
Đơn vị chính của tổ chức mã trong kho lưu trữ là gói. Gói là một tập hợp các tệp liên quan và một thông số kỹ thuật về cách sử dụng các tệp này để tạo ra các 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. 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ả các thư mục con bên dưới gói,
ngoại trừ những thư mục tự 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ể là một phần của hai gói khác nhau.
Ví dụ: trong cây thư mục sau, có 2 gói là my/app,
và gói con my/app/tests. Xin lưu ý rằng 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 là một trong hai loại chính: tệp và quy tắc.
Các tệp được chia thành 2 loại. Tệp nguồn thường được viết bởi nỗ lực của mọi người và được kiểm tra trong kho lưu trữ. 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 kiểm tra 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 tệp đầu vào và một tập hợp tệp đầu ra. Đầ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.
Việc đầu vào của một quy tắc là tệp nguồn hay tệp đã tạo trong hầu hết các trường hợp đều không quan trọng; điều quan trọng là chỉ có 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 đã tạo do một quy tắc tạo ra, chẳng hạn như khi gánh nặng duy trì thủ công một tệp có cấu trúc cao trở nên quá mệt mỏi và ai đó viết một chương trình để lấy tệp đó. Không cần thay đổi đối với người dùng của tệp đó. Ngược lại, bạn có thể dễ dàng thay thế tệp đã tạo bằng tệp nguồn chỉ với các thay đổi cục bộ.
Đầ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ề mặt trực quan thì 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++ khác B cho đầ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 bất biến 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 về 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 phải là hiếm khi đầ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 là giới hạn khả năng truy cập của
một số quy tắc. Nhóm gói được xác định bằng hàm package_group. Chúng
có 3 thuộc tính: danh sách các gói mà chúng chứa, tên của chúng và các nhóm gói
khác mà chúng bao gồm. Cách duy nhất được phép tham chiếu đến chúng 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; 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 package_group
tài liệu.