Không gian làm việc, gói và mục tiêu

Bazel xây dựng phần mềm từ mã nguồn được sắp xếp trong một cây thư mục gọi là 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 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 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 xây dựng từ nguồn.

Không gian làm việc

Không gian làm việc là một cây thư mục trên hệ thống tệp chứa các tệp nguồn cho phần mề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 tên là WORKSPACE Tệp này có thể trống hoặc có thể chứa các tham chiếu đến các phần phụ thuộc bên ngoài cần thiết để xây dựng đầu ra.

Các thư mục chứa một tệp tên là WORKSPACE được coi là thư mục gốc của không gian làm việc. Do đó, Bazel bỏ qua mọi cây thư mục trong một không gian làm việc có gốc là một thư mục con chứa tệp WORKSPACE, vì các thư mục 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 bí danh của tệp WORKSPACE. Nếu cả hai tệp đều tồn tại, thì WORKSPACE.bazel sẽ được sử dụng.

Kho lưu trữ

Mã được sắp xếp trong kho lưu trữ. Thư mục chứa tệp WORKSPACE là thư mục gốc của kho lưu trữ chính, còn được gọi là @. Các kho lưu trữ khác (bên ngoài) được xác định trong tệp WORKSPACE bằng cách sử dụ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. 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.

Các quy tắc không gian làm việc được gói cùng với Bazel được ghi lại trong phần Quy tắc Không gian làm việc trong Bách khoa toàn thư về bản dựng và tài liệu về các quy tắc kho lưu trữ Starlark được nhúng.

Vì bản thân các kho lưu trữ bên ngoài là kho lưu trữ, nên chúng thường chứa cả tệp WORKSPACE. Tuy nhiên, Bazel bỏ qua các tệp WORKSPACE bổ sung này. Cụ thể, các kho lưu trữ phụ thuộc một cách bắc cầu sẽ 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. Gói là một tập hợp các tệp có 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 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ệpquy tắc.

Các tệp được chia thành 2 loại. Tệp nguồn thường do người dùng viết 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 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. Đầ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 đã tạo đề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ế một tệp đã tạo bằng một 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: một quy tắc thư viện C++ A có thể có một quy tắc thư viện C++ B khác 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 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ất định. 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 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 thông tin, hãy tham khảo package_group tài liệu.

Nhãn