Bazel tạo phần mềm từ mã nguồn được sắp xếp trong một cây thư mục có tên là
một không gian làm việc. Các tệp nguồn trong không gian làm việc được sắp xếp trong phần lồng ghép
hệ thống phân cấp gói, trong đó mỗi gói là một thư mục chứa một tập hợp
gồm các tệp nguồn có liên quan và một tệp BUILD
. Tệp BUILD
chỉ định thông tin
đầu ra phần mềm 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
các phần phụ thuộc bên ngoài 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ị can thiệp vào hệ thống
tại 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, thì WORKSPACE.bazel
sẽ đượ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 quy tắc không gian làm việc.
Các quy tắc không gian làm việc đi kèm với Bazel được ghi lại trong Quy tắc không gian làm việc trong phần Xây dựng Bách khoa toàn thư và tài liệu về các quy tắc của kho lưu trữ Starlark được nhúng.
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 nhau,
không đượ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 package 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 chúng có thể được sử dụng để tạo cấu phần phần mềm đầu ra.
Gói được định nghĩa là 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 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 gói khác nhau.
Ví dụ: trong cây thư mục sau
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à 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ằng nỗ lực của con người và đăng ký 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 quy tắc thực thể 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. Đầu vào cho quy tắc có thể là tệp nguồn, nhưng chúng cũng có thể là kết quả của các quy tắc khác.
Đầu vào cho 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 là phi vật chất; điều quan trọng chỉ là nội dung trong đó . 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 do một quy tắc tạo ra, chẳng hạn như khi hàm duy trì một tệp có cấu trúc cao theo cách thủ công nhàm chán và có người viết một chương trình để lấy ý tưởng đó. Không có thay đổi là bắt buộc đối với người dùng của tệp đó. Ngược lại, một lượt hiển thị tệp có thể dễ dàng được thay thế bằng tệp nguồn chỉ có tệp cục bộ thay đổi.
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. Chiến lược phát hành đĩa đơn ý nghĩa chính xác của những 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 về mặt trực quan, nó rất đơn giản: một C++ quy tắc thư viện A có thể có một quy tắc thư viện C++ B khá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ó thể sử dụng với 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 biên dịch trong khi liên kết và dữ liệu thời gian chạy của B có sẵn cho A trong thời gian thực thi.
Bất biến của tất 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ới chính quy tắc đó; không có thể tạo tệp vào một gói khác. Không có gì bất thường cho dữ liệu đầ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 giới hạn khả năng hỗ trợ tiếp cận
quy tắc nhất định. Nhóm gói được xác định bằng hàm package_group
.
Các lớp này có ba thuộc tính: danh sách các gói chứa trong đó, tên của chúng và
các nhóm gói khác mà họ 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ừ default_visibility
thuộc tính 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 package_group
.