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

Báo cáo vấn đề Xem nguồn

Bazel xây dựng phần mềm từ mã nguồn được sắp xếp trong cây thư mục có tên 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ệ 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 của phần mềm có thể được tạo từ nguồn.

sử dụng

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

Các thư mục chứa tệp WORKSPACE được coi là gốc của không gian làm việc. 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, khi chúng 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 tồn tại, 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ữ (bên ngoài) khác đượ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ề phần phụ thuộc bên ngoài để biết thêm thông tin.

Các quy tắc của không gian làm việc trong Bazel được nêu trong mục Quy tắc không gian làm việc trong Từ điển bách khoa xây dựng và tài liệu về quy tắc 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 cũng thường chứa tệp WORKSPACE. Tuy nhiên, Bazel sẽ bỏ qua các tệp WORKSPACE bổ sung này. Cụ thể, những kho lưu trữ phụ thuộc vào quá trình chuyển sẽ không được tự động thêm vào.

Gói

Đơn vị tổ chức mã chính 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 dùng các tệp này để tạo tệp 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 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, ngoại trừ những tệp có chứa BUILD. Theo định nghĩa này, không có tệp hoặc thư mục nào 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. 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à 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 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ởi nỗ lực của mọi người và được đăng ký vào kho lưu trữ. Tệp đã tạo (đôi khi được gọi là tệp phát sinh hoặc tệp đầu ra) không được đăng ký, nhưng được tạo từ 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 các giá trị đầu vào và một tập hợp các tệp đầu ra. Dữ liệu đầu vào cho một quy tắc có thể là tệp nguồn, nhưng cũng có thể là kết quả của các quy tắc khác.

Cho dù dữ liệu đầ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 không quan trọng; điều quan trọng chỉ là 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 được tạo theo quy tắc, chẳng hạn như khi gánh nặng duy trì một tệp có cấu trúc cao theo cách thủ công trở nên quá mệt mỏi và một người nào đó viết một chương trình để lấy tệp đó. Người dùng của tệp đó không cần phải 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 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 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 nó 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 đối với đầu vào. Ảnh hưở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 biểu tượng 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 điểm không thể thay đổi 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 cùng một gói với chính quy tắc đó. Do đó, bạn 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 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 hạn chế 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ó ba thuộc tính: danh sách các gói chứa trong đó, tên của các gói và các nhóm gói khác có trong các gói đó. Bạn chỉ có thể tham chiếu đến các quy tắc đó 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; các quy tắc này 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