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

Báo cáo vấn đề Xem nguồn Nightly · 7.4 . 7.3 · 7.2 · 7.1 · 7.0 · 6.5

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 một tập hợp tệp nguồn và một tệp BUILD. Tệp BUILD chỉ định những đầu ra phần mềm 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 chứa các tệp nguồn cho phần mềm mà bạn muốn tạo. 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 sẽ bỏ qua mọi cây thư mục trong một 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 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, 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 tệp WORKSPACE là thư mục gốc của kho lưu trữ chính, còn gọi là @. Các kho lưu trữ (bên ngoài) khác đượ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. Hãy xem tổng quan về 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 đi kèm 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ì 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, Bazel sẽ 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 của việc 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 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.

Gói được định nghĩa là một thư mục chứa Tệp BUILD có tên là BUILD hoặc BUILD.bazel. Đáp gói này 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 trong gói đó, ngoại trừ những tệp 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ể thuộc hai gói khác nhau.

Ví dụ: trong cây thư mục sau đây có hai gói, 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à vùng chứa mục tiêu được xác định trong tệp BUILD của gói. Hầu hết mục tiêu là một trong hai loại chính: tệpquy 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 mọi người và được kiểm tra vào 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ừ 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. 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 tệp đó không cần thay đổi gì. Ngược lại, tệp đã tạo 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 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ề trực quan, ý nghĩa này 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 dữ liệu đầ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 hằng số 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 có gì lạ khi dữ liệu đầ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 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. Các nhóm gói này có ba thuộc tính: danh sách các gói chứa trong đó, tên và các nhóm gói khác chứa trong đó. 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 thông tin, hãy tham khảo tài liệu về package_group.

Nhãn