Trong thế giới phát triển phần mềm, việc xây dựng và quản lý các dự án lớn đòi hỏi một hệ thống xây dựng mạnh mẽ và linh hoạt. Bazel, một hệ thống xây dựng mã nguồn mở, cung cấp một giải pháp toàn diện để quản lý các dự án phức tạp. Bài viết này sẽ đi sâu vào các hàm quan trọng trong tệp BUILD của Bazel, tập trung vào những chức năng chính và cách chúng định hình quá trình xây dựng.
package
Hàm package
đóng vai trò trung tâm trong việc 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 chỉ có thể chứa tối đa một lệnh gọi hàm package
.
package(default_deprecation, default_package_metadata, default_testonly, default_visibility, features)
Các đối số của hàm package
bao gồm:
default_visibility
: Xác định khả năng hiển thị mặc định của các mục tiêu và macro tượng trưng trong gói.default_deprecation
: Đặt thông báo không dùng nữa mặc định cho các quy tắc trong gói.default_package_metadata
: Chỉ định danh sách các mục tiêu siêu dữ liệu áp dụng cho tất cả các mục tiêu khác trong gói.default_testonly
: Đặt thuộc tínhtestonly
mặc định cho các quy tắc trong gói.features
: Danh sách các cờ ảnh hưởng đến ngữ nghĩa của tệp BUILD.
Ví dụ, để khai báo rằng các quy tắc trong gói chỉ hiển thị cho các thành viên của nhóm gói //foo:target
, bạn có thể sử dụng:
package(default_visibility = ["//foo:target"])
package_group
Hàm package_group
định nghĩa 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
.
package_group(name, packages, includes)
Các đối số của hàm package_group
bao gồm:
name
: Tên duy nhất cho mục tiêu.packages
: Danh sách các thông số kỹ thuật của gói.includes
: Danh sách các nhóm gói khác có trong nhóm này.
Ví dụ, để tạo một nhóm gói có tên “tropical” chứa các loại trái cây nhiệt đới, bạn có thể sử dụng:
package_group( name = "tropical", packages = [ "//fruits/mango", "//fruits/orange", "//fruits/papaya/...", ], )
exports_files
Hàm exports_files
chỉ định danh sách các tệp thuộc gói này được xuất sang các gói khác. Điều này cho phép các gói khác tham chiếu trực tiếp đến các tệp nguồn.
exports_files([label, ...], visibility, licenses)
Đối số của hàm exports_files
là danh sách tên của các tệp trong gói hiện tại. Bạn cũng có thể chỉ định chế độ hiển thị và giấy phép.
Ví dụ, để xuất tệp golden.txt
từ gói test_data
, bạn có thể sử dụng:
exports_files(["golden.txt"])
glob
Hàm glob
tìm tất cả các tệp khớp với một số mẫu đường dẫn nhất định và trả về một danh sách đường dẫn mới, có thể thay đổi và được sắp xếp. 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 hay các mục tiêu khác).
glob(include, exclude=[], exclude_directories=1, allow_empty=True)
Các đối số của hàm glob
bao gồm:
include
: Danh sách các mẫu đường dẫn để bao gồm.exclude
: Danh sách các mẫu đường dẫn để loại trừ.exclude_directories
: Chỉ định có loại trừ các thư mục hay không.allow_empty
: Chỉ định có cho phép kết quả trống hay không.
Ví dụ, để tạo một thư viện Java được tạo từ tất cả các tệp java trong thư mục này và tất cả các tệp do quy tắc :gen_java_srcs
tạo, bạn có thể sử dụng:
java_library( name = "mylib", srcs = glob(["*.java"]) + [":gen_java_srcs"], deps = "...", ) genrule( name = "gen_java_srcs", outs = [ "Foo.java", "Bar.java", ], ... )
select
Hàm select
cho phép thuộc tính quy tắc có thể định cấu hình, nghĩa là giá trị của thuộc tính có thể phụ thuộc vào cờ Bazel dòng lệnh.
select( {conditionA: valuesA, conditionB: valuesB, ...}, no_match_error = "custom message" )
Ví dụ, để làm cho thuộc tính srcs
của sh_binary
có thể định cấu hình, bạn có thể sử dụng:
sh_binary( name = "mytarget", srcs = select({ ":conditionA": ["mytarget_a.sh"], ":conditionB": ["mytarget_b.sh"], "//conditions:default": ["mytarget_default.sh"] }) )
subpackages
Hàm subpackages
liệt kê các gói con, tương tự như glob
liệt kê các tệp và thư mục.
subpackages(include, exclude=[], allow_empty=True)
Ví dụ, để liệt kê tất cả các gói con trực tiếp cho gói foo/BUILD
, bạn có thể sử dụng:
subs1 = subpackages(include = ["**"])
Tóm lại, các hàm package
, package_group
, exports_files
, glob
, select
và subpackages
là những thành phần cơ bản của tệp BUILD trong Bazel. Chúng cho phép bạn định nghĩa siêu dữ liệu gói, quản lý khả năng hiển thị, xuất tệp, tìm tệp, cấu hình thuộc tính quy tắc và liệt kê các gói con. Việc nắm vững các hàm này là rất quan trọng để xây dựng và quản lý các dự án phức tạp bằng Bazel.