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

Báo cáo vấn đề Xem nguồn Nightly/3}

Bazel xây dựng phần mềm từ mã nguồn được sắp xếp trong 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ệ phân cấp các gói lồng nhau, 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 các đầ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 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 tên là WORKSPACE. Tệp này 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 kết quả.

Các thư mục chứa tệp có 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 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, khi các cây 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 tệp WORKSPACE là 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.

Các quy tắc không gian làm việc đi kèm với Bazel được trình bày trong phần Quy tắc của Workspace trong Xây dựng Bách khoa toàn thư và tài liệu về các quy tắc về 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 các kho lưu trữ này 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 vào bắc cầu 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à thông số kỹ thuật về cách dùng các tệp đó để tạo ra 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). Gói bao gồm tất 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 thư mục 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 về 2 gói khác nhau.

Ví dụ: trong cây thư mục sau đây, 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 các 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 ghi 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á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 thực thể quy tắc chỉ định mối quan hệ giữa một tập hợp các tệp đầ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à đầu ra của các quy tắc khác.

Cho dù đầ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 đều là 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 do quy tắc tạo ra, chẳng hạn như khi gánh nặng của việc duy trì một tệp có cấu trúc cao trở nên quá mệt mỏi và có người viết một chương trình để lấy được tệp đó. Người dùng tệp đó không cần phải thay đổi. 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 trên thực tế thì rất đơn giản: một quy tắc A của thư viện C++ có thể có một quy tắc B khác của thư viện C++ làm 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 sẽ được cung cấp cho A trong quá trình biên dịch, các biểu tượng của B sẽ được cung cấp cho A trong quá trình liên kết và các dữ liệu thời gian chạy của B sẽ được cung cấp cho A trong quá trình thực thi.

Bất biến của mọi 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 đó; bạn không thể tạo tệp vào một gói khác. Tuy nhiên, phổ biến là 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 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 đối tượng 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 có trong đó. Cách duy nhất được phép để tham chiếu đến các API 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 hàm 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