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ư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 các 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ữ khác (bên ngoài) được xác định theo 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.
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 lưu trữ chính. Không gian 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 đượ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 để 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 liên quan và thông số kỹ thuật về cách sử dụng các tệp đó để 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 đây, 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 đều thuộc một trong hai loại chính là 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 được tạo (đôi khi được gọi là tệp phái sinh 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 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 quy tắc là tệp nguồn hay tệp được tạo 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ế tệp nguồn phức tạp bằng tệp được tạo do quy tắc tạo ra, chẳng hạn như khi gánh nặng duy trì tệp có cấu trúc cao 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 đó. Không cần thay đổi đối với người dùng tệp đó. Ngược lại, bạn có thể dễ dàng thay thế tệp được tạo bằng tệp nguồn chỉ với các thay đổi cục bộ.
Đầu vào của 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 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 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 tiếp cận 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.