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

Sử dụng bộ sưu tập để sắp xếp ngăn nắp các trang Lưu và phân loại nội dung dựa trên lựa chọn ưu tiên của bạn.
Báo cáo sự cố Xem nguồn

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 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 một hệ thống phân cấp lồng nhau, trong đó mỗi gói là một thư mục chứa tập hợp các tệp nguồn liên quan và một tệp BUILD. Tệp BUILD chỉ định những dữ liệu đầu ra của phần mềm có thể được tạo 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 của bạn, trong đó có chứa các tệp nguồn của 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 các thông tin tham chiếu đến các phần phụ thuộc bên ngoài cần thiết để tạo dữ liệu đầu ra.

Các thư mục chứa tệp có tên 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 bị can thiệp vào 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 tồn tại cả hai tệp, 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 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 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 mục Quy tắc không gian làm việc trong Quy tắc bách khoa bản dựng và tài liệu về quy tắc kho lưu trữ Starlark được nhúng.

Vì kho lưu trữ bên ngoài là chính những kho lưu trữ, nên chúng cũng thường chứa một tệp 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 bắc cầu 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 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 (hoặc BUILD.bazel). Một gói bao gồm tất cả tệp trong thư mục, cộng với tất cả thư mục con bên dưới gói đó, ngoại trừ các thư mục con chứa chính tệp BUILD. Theo định nghĩa này, không có tệp hoặc thư mục nào có thể nằm trong hai gói khác nhau.

Ví dụ: trong cây thư mục sau, 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 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 ghi bởi nỗ lực của mọi người và được đăng ký vào kho lưu trữ. Các 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 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 phiên bản quy tắc chỉ định mối quan hệ giữa một tập hợp các đầu vào và một tập hợp các tệp đầu ra. Đầ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.

Đầu vào cho một quy tắc là tệp nguồn hay tệp được tạo trong hầu hết trường hợp đều không quan trọng; điều quan trọng là nội dung của tệp đó. Trên thực tế, bạn có thể dễ dàng thay thế một tệp nguồn phức tạp bằng một tệp do một quy tắc tạo ra, chẳng hạn như trong trường hợp gánh nặng để duy trì tệp được cấu trúc cao theo cách thủ công trở nên quá mệt mỏi và người nào đó viết một chương trình để lấy tệp đó. Người tiêu dùng của tệp đó không cần phải thay đổi. Ngược lại, tệp được 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ộ.

Thông tin đầ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ệ đó 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: quy tắc thư viện C++ A có thể có một quy tắc thư viện C++ khác dành 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ó 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 khi 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 bất biến của tất cả các quy tắc là các tệp được tạo bởi quy tắc luôn thuộc về cùng một gói với quy tắc; 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ạ dữ liệu đầu vào của quy tắc đến từ gói khác.

Nhóm gói là các nhóm gói có mục đích giới hạn khả năng tiếp cận 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. Các mục 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 mà chúng bao gồm. Cách duy nhất được phép tham chiếu đến các quy tắc 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; 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