Bazel tạo phần mềm từ mã nguồn được sắp xếp trong cây thư mục có tên là
Workspace. Các tệp nguồn trong không gian làm việc được sắp xếp theo hệ thống phân cấp lồng nhau
các gói, trong đó mỗi gói là một thư mục chứa tập hợp các gói
tệp nguồn và một tệp BUILD
. Tệp BUILD
chỉ định phần mềm nào
đầu ra có thể được tạo từ nguồn.
Workspace
Không gian làm việc là một cây thư mục trên hệ thống tệp của bạn có chứa nguồn
cho phần mềm bạn muốn xây dựng. Mỗi không gian làm việc có một tệp văn bản có tên
WORKSPACE
có thể trống hoặc có thể chứa thông tin tham chiếu đến bên ngoài
các phần phụ thuộc cần thiết để tạo đầu ra.
Các thư mục chứa tệp có tên là WORKSPACE
được xem là gốc của tệp
Workspace. Do đó, Bazel bỏ qua mọi cây thư mục trong không gian làm việc bắt nguồn từ
một thư mục con chứa tệp WORKSPACE
, vì các tệp này tạo thành một không gian làm việc khác.
Bazel cũng hỗ trợ tệp WORKSPACE.bazel
dưới dạng email đại diện của tệp WORKSPACE
. Nếu
cả hai tệp đều tồn tại, WORKSPACE.bazel
được dùng.
Kho lưu trữ
Mã được sắp xếp trong kho lưu trữ. Thư mục chứa WORKSPACE
là gốc của kho lưu trữ chính, còn được gọi là @
. Khác, (bên ngoài)
kho lưu trữ được xác định trong tệp WORKSPACE
bằng các quy tắc không gian làm việc, hoặc
được tạo từ các mô-đun và tiện ích trong hệ thống Bzlmod. Xem bên ngoài
tổng quan về phần phụ thuộc để biết thêm thông tin.
Các quy tắc không gian làm việc đi kèm với Bazel được ghi lại trong Không gian làm việc Phần Quy tắc trong phần Tạo Bách khoa toàn thư và tài liệu về nội dung được nhúng Quy tắc về kho lưu trữ Starlark.
Vì kho lưu trữ bên ngoài là chính kho lưu trữ, nên chúng thường chứa
WORKSPACE
. Tuy nhiên, WORKSPACE
tệp bổ sung này
bị Bazel bỏ qua. Cụ thể, các kho lưu trữ phụ thuộc vào bắc cầu không được
được thêm tự động.
Gói
Đơn vị chính để sắp xếp mã trong kho lưu trữ là gói. Đáp gói là một tập hợp các tệp liên quan và chỉ rõ cách các tệp đó có thể được dùng để tạo các cấu phần phần mềm đầu ra.
Một gói được định nghĩa là một thư mục chứa tệp 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 nó, ngoại trừ những thư mục con có chứa tệp BUILD
.
Theo đị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
.
Ví dụ: trong cây thư mục sau đây, có hai gói, my/app
,
và gói con my/app/tests
. Lưu ý my/app/data
không phải là một gói, nhưng
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 phần tử của gói
BUILD
. Hầu hết mục tiêu là một trong hai loại chính, tệp và quy tắ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à đăng ký vào kho lưu trữ. Tệp đã tạo, thường được gọi là tệp phái sinh hoặc tệp đầu ra, không được đăng ký, nhưng đượ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. Từng phiên bản của quy tắc chỉ định mối quan hệ giữa một tập hợp các tệp đầu vào và một tập hợp các tệp đầu ra. Chiến lược phát hành đĩa đơn đầu vào cho một quy tắc có thể là tệp nguồn, nhưng cũng có thể là đầu ra của quy tắc.
Dữ liệu đầu vào cho quy tắc là tệp nguồn hay tệp được tạo đều ở hầu hết trường hợp không quan trọng; điều quan trọng chỉ là nội dung của tệp đó. Dữ kiện này giúp dễ dàng thay thế một tệp nguồn phức tạp bằng một tệp được tạo bằng một quy tắc cụ thể, chẳng hạn như xảy ra khi gánh nặng phải tự mình duy trì tệp có cấu trúc trở nên quá mệt mỏi và ai đó đã viết chương trình để lấy được tệp đó. Người dùng của tệp đó không bắt buộc phải thay đổi. Ngược lại, một lượt hiển thị 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 những thuật ngữ đó các mối quan hệ thường khá phức tạp và phụ thuộc vào ngôn ngữ hoặc quy tắc, nhưng một cách trực quan thì rất đơn giản: quy tắc thư viện C++ A có thể có một thư viện C++ khác quy tắc B 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 A trong quá trình biên dịch, các ký hiệu của B khả dụng với 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 về gói giống như chính quy tắc; không thể tạo tệp thành một gói khác. Thông thường, thông tin đầu vào của một quy tắc lại đến từ một thông tin 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 truy cập
quy tắc nhất định. Nhóm gói được xác định bằng hàm package_group
. Chúng
có ba 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 thuộc tính khác
các nhóm gói mà chúng bao gồm. Cách duy nhất được phép để tham chiếu đến các mô-đun này là 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
, hãy tham khảo package_group
tài liệu.