Bazel là một hệ thống xây dựng mã nguồn mở được sử dụng để tự động hóa việc xây dựng và kiểm tra phần mềm. Bazel sử dụng các tệp BUILD để mô tả các phần phụ thuộc và quy tắc xây dựng cho một dự án. Trong các tệp BUILD, có một số hàm tích hợp sẵn có thể được sử dụng để định nghĩa các quy tắc xây dựng và quản lý các phần phụ thuộc. Bài viết này sẽ khám phá các hàm package
, package_group
, exports_files
, glob
, select
, và subpackages
trong Bazel, cung cấp Ví Dụ Cơ Quan Tương Tự và cách sử dụng chúng.
package
Hàm package
được sử dụng để khai báo siêu dữ liệu áp dụng cho tất cả các quy tắc trong một gói (tệp BUILD). Hàm này thường được sử dụng để thiết lập các giá trị mặc định cho các thuộc tính như khả năng hiển thị, thông báo ngừng sử dụng và siêu dữ liệu gói.
Alt text: Hình ảnh minh họa cấu trúc thư mục dự án Bazel, thể hiện mối quan hệ giữa các thư mục, tệp BUILD và tệp nguồn. Từ khóa: Bazel, cấu trúc thư mục, tệp BUILD, tệp nguồn, dự án.
Ví dụ cơ quan tương tự:
Tưởng tượng bạn đang quản lý một dự án web lớn với nhiều gói khác nhau. Bạn muốn tất cả các gói trong dự án đều có cùng một thông báo ngừng sử dụng mặc định để cảnh báo người dùng về các tính năng không còn được hỗ trợ. Bạn có thể sử dụng hàm package
để thiết lập thông báo ngừng sử dụng mặc định cho tất cả các quy tắc trong các gói này.
package(default_deprecation = "Tính năng này sẽ ngừng hoạt động trong phiên bản tiếp theo.")
Ví dụ sử dụng:
package(
default_visibility = ["//visibility:public"],
default_testonly = True,
)
Đoạn mã trên thiết lập khả năng hiển thị mặc định là công khai và thuộc tính testonly
là True
cho tất cả các quy tắc trong gói hiện tại.
package_group
Hàm package_group
được sử dụng để xác định một tập hợp các gói và liên kết một nhãn với tập hợp đó. Nhãn này có thể được tham chiếu trong thuộc tính visibility
để kiểm soát quyền truy cập vào các mục tiêu xây dựng.
Alt text: Minh họa cấu trúc gói trong Bazel với các thư mục và tệp BUILD, thể hiện cách nhóm các gói lại với nhau. Từ khóa: Bazel, cấu trúc gói, thư mục, tệp BUILD, nhóm.
Ví dụ cơ quan tương tự:
Bạn có một số gói chứa mã lõi mà bạn chỉ muốn các gói cụ thể trong dự án của mình truy cập. Bạn có thể sử dụng package_group
để xác định một nhóm gói được phép truy cập mã lõi và sau đó sử dụng thuộc tính visibility
để giới hạn quyền truy cập.
package_group(
name = "core_team",
packages = [
"//project/core",
"//project/utils",
],
)
Ví dụ sử dụng:
package_group(
name = "my_package_group",
packages = [
"//foo/...",
"-//foo/tests/...",
],
)
Đoạn mã trên định nghĩa một nhóm gói có tên my_package_group
bao gồm tất cả các gói con của //foo
nhưng loại trừ tất cả các gói con của //foo/tests
.
exports_files
Hàm exports_files
chỉ định danh sách các tệp thuộc một gói có thể được truy cập từ các gói khác. Theo mặc định, các tệp nguồn trong một gói không thể được truy cập trực tiếp từ các gói khác trừ khi chúng được xuất rõ ràng bằng exports_files
.
Ví dụ cơ quan tương tự:
Bạn có một số tệp cấu hình mà bạn muốn chia sẻ giữa các gói khác nhau trong dự án của mình. Bạn có thể sử dụng exports_files
để xuất các tệp cấu hình này và cho phép các gói khác truy cập chúng.
Ví dụ sử dụng:
exports_files(
[
"my_data.txt",
"config.ini",
],
visibility = ["//visibility:public"],
)
Đoạn mã trên xuất các tệp my_data.txt
và config.ini
và làm cho chúng có thể truy cập được từ tất cả các gói trong dự án.
glob
Hàm glob
được sử dụng để tìm tất cả các tệp khớp với một số mẫu đường dẫn nhất định. Hàm này trả về một danh sách các đường dẫn, có thể được sử dụng làm đầu vào cho các quy tắc xây dựng khác. glob
chỉ tìm kiếm các tệp trong gói của riêng nó và chỉ tìm các tệp nguồn (không phải tệp được tạo).
Alt text: Ảnh chụp màn hình IDE cho thấy cách sử dụng glob để tìm kiếm tệp theo mẫu. Từ khóa: glob, tìm kiếm tệp, IDE, mẫu, code completion.
Ví dụ cơ quan tương tự:
Bạn muốn biên dịch tất cả các tệp .java
trong một thư mục cụ thể. Bạn có thể sử dụng hàm glob
để tìm tất cả các tệp .java
và sau đó chuyển danh sách các tệp này cho quy tắc biên dịch Java.
Ví dụ sử dụng:
java_library(
name = "my_library",
srcs = glob(["*.java"]),
deps = [
"//third_party/guava",
],
)
Đoạn mã trên tạo một thư viện Java từ tất cả các tệp .java
trong gói hiện tại.
select
Hàm select
cho phép các thuộc tính quy tắc được định cấu hình. Điều này có nghĩa là giá trị của một thuộc tính có thể phụ thuộc vào các cờ Bazel dòng lệnh. Ví dụ: bạn có thể sử dụng select
để chỉ định các phần phụ thuộc khác nhau cho các nền tảng khác nhau.
Ví dụ cơ quan tương tự:
Bạn muốn sử dụng một thư viện khác nhau tùy thuộc vào hệ điều hành mà bạn đang xây dựng. Bạn có thể sử dụng hàm select
để chỉ định các thư viện khác nhau cho các hệ điều hành khác nhau.
Ví dụ sử dụng:
cc_binary(
name = "my_binary",
srcs = ["my_binary.cc"],
deps = select({
"//conditions:linux": ["//linux_library"],
"//conditions:windows": ["//windows_library"],
"//conditions:default": ["//default_library"],
}),
)
Đoạn mã trên tạo một tệp nhị phân C++ sử dụng thư viện //linux_library
trên Linux, thư viện //windows_library
trên Windows và thư viện //default_library
trên các nền tảng khác.
subpackages
Hàm subpackages
liệt kê các gói con trực tiếp của gói hiện tại. Hàm này sử dụng cùng một mẫu đường dẫn với glob
.
Ví dụ cơ quan tương tự:
Bạn muốn tạo một quy tắc xây dựng áp dụng cho tất cả các gói con trong một thư mục cụ thể. Bạn có thể sử dụng subpackages
để liệt kê tất cả các gói con và sau đó tạo một quy tắc xây dựng cho mỗi gói con.
Ví dụ sử dụng:
subpackages(
include = ["my_package/*"],
exclude = ["my_package/tests"],
)
Đoạn mã trên liệt kê tất cả các gói con của my_package
ngoại trừ gói my_package/tests
.
Các hàm này, package
, package_group
, exports_files
, glob
, select
, và subpackages
là các công cụ mạnh mẽ để quản lý các phần phụ thuộc và quy tắc xây dựng trong Bazel. Bằng cách hiểu cách sử dụng các hàm này, bạn có thể tạo các tệp BUILD linh hoạt và dễ bảo trì.