Nội dung
gói hàng
package(default_deprecation, default_testonly, default_visibility, features)
Hàm này khai báo siêu dữ liệu áp dụng cho mọi quy tắc tiếp theo trong . Mã này được sử dụng tối đa một lần trong gói (tệp BUILD).
Hàm package() nên được gọi ngay sau tất cả các câu lệnh tải() ở đầu trước bất kỳ quy tắc nào.
Đối số
Thuộc tính | Mô tả |
---|---|
default_visibility |
Chế độ hiển thị mặc định của các quy tắc trong gói này. Mọi quy tắc trong gói này có chế độ hiển thị được chỉ định trong
trừ phi có quy định khác trong |
default_deprecation |
Đặt mặc định
Thông báo |
default_testonly |
Đặt mặc định
Thuộc tính Trong các gói thuộc |
features |
Đặt nhiều cờ ảnh hưởng đến ngữ nghĩa của tệp BUILD này. Tính năng này chủ yếu được những người làm việc trên hệ thống xây dựng sử dụng để các gói thẻ cần xử lý đặc biệt. Không sử dụng, trừ phi được người làm việc trên hệ thống xây dựng yêu cầu rõ ràng. |
Ví dụ
Phần khai báo dưới đây khai báo rằng các quy tắc trong gói này là chỉ hiển thị cho các thành viên của gói nhóm//foo:target
. Khai báo từng chế độ hiển thị
đối với quy tắc, nếu có, hãy ghi đè quy cách này.
package(default_visibility = ["//foo:target"])
package_group
package_group(name, packages, includes)
Hàm này 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. Bạn có thể tham chiếu nhãn trong
Thuộc tính visibility
.
Các nhóm gói chủ yếu được dùng để kiểm soát chế độ hiển thị. Hiển thị công khai target có thể được tham chiếu từ mọi gói trong cây nguồn. A ở chế độ riêng tư đích hiển thị chỉ có thể được tham chiếu trong gói riêng (không phải gói con). Giữa các trường hợp này, mục tiêu có thể cho phép truy cập vào gói của chính nó cộng với bất kỳ gói được mô tả bởi một hoặc nhiều nhóm gói. Để biết thêm chi tiết về hệ thống hiển thị, hãy xem khả năng hiển thị .
Một gói hàng nhất định được coi là nằm trong nhóm nếu gói đó khớp với
thuộc tính packages
hoặc đã có trong một thuộc tính khác
các nhóm gói được đề cập trong thuộc tính includes
.
Nhóm gói là mục tiêu về mặt kỹ thuật, nhưng không được tạo theo quy tắc và không có biện pháp bảo vệ chế độ hiển thị nào.
Đối số
Thuộc tính | Mô tả |
---|---|
name |
Tên duy nhất cho mục tiêu này. |
packages |
Danh sách không có hoặc có nhiều thông số kỹ thuật của gói. Mỗi chuỗi thông số kỹ thuật của gói có thể có một trong các thông số sau biểu mẫu:
Ngoài ra, hai kiểu thông số kỹ thuật đầu tiên của gói cũng có thể
có tiền tố Nhóm gói chứa bất kỳ gói nào khớp với ít nhất một trong
thông số kỹ thuật tích cực và không có thông số kỹ thuật tiêu cực nào
Ví dụ: giá trị Ngoài chế độ hiển thị công khai, không có cách nào để chỉ định trực tiếp các gói bên ngoài kho lưu trữ hiện tại. Nếu thiếu thuộc tính này, nó cũng giống như việc đặt thuộc tính thành
danh sách trống, cũng giống như việc đặt danh sách này thành danh sách chứa
chỉ Lưu ý: Trước Bazel 6.0, quy cách Lưu ý: Trước Bazel 6.0, khi thuộc tính này được chuyển đổi tuần tự là
một phần của |
includes |
Các nhóm gói khác được bao gồm trong mục này. Nhãn trong thuộc tính này phải tham chiếu đến các nhóm gói khác.
Các gói trong nhóm gói được tham chiếu sẽ được đưa vào quá trình này
nhóm gói. Đây là bắc cầu – nếu nhóm gói
Khi sử dụng cùng với thông số kỹ thuật của gói bị bỏ qua, xin lưu ý rằng cho mỗi nhóm được tính toán độc lập và các kết quả sau đó được tập hợp với nhau. Điều này có nghĩa là các thông số kỹ thuật trong một nhóm không ảnh hưởng đến các thông số kỹ thuật trong một nhóm khác. |
Ví dụ
Nội dung khai báo package_group
sau đây chỉ định một
nhóm gói có tên là "nhiệt đới" có chứa trái cây nhiệt đới.
package_group( name = "tropical", packages = [ "//fruits/mango", "//fruits/orange", "//fruits/papaya/...", ], )
Các khai báo sau chỉ định nhóm gói của một hư cấu ứng dụng:
package_group( name = "fooapp", includes = [ ":controller", ":model", ":view", ], ) package_group( name = "model", packages = ["//fooapp/database"], ) package_group( name = "view", packages = [ "//fooapp/swingui", "//fooapp/webui", ], ) package_group( name = "controller", packages = ["//fooapp/algorithm"], )
exports_files
exports_files([label, ...], visibility, licenses)
exports_files()
chỉ định một danh sách các tệp thuộc về
và gói này được xuất sang các gói khác.
Tệp BUILD cho một gói chỉ có thể tham chiếu trực tiếp đến các tệp nguồn thuộc
sang một gói khác nếu chúng được xuất rõ ràng bằng
Câu lệnh exports_files()
. Đọc thêm về
khả năng hiển thị của tệp.
Theo hành vi cũ, các tệp được đề cập dưới dạng dữ liệu đầu vào cho quy tắc cũng được xuất
với chế độ hiển thị mặc định cho đến khi cờ
--incompatible_no_implicit_file_export
bị lật. Tuy nhiên, bạn không nên dựa vào và chủ động làm theo hành vi này
đã di chuyển.
Đối số
Đối số là danh sách tên của các tệp trong gói hiện tại. Đáp
khai báo chế độ hiển thị cũng có thể được chỉ định; trong trường hợp này, các tệp sẽ được
hiển thị cho các mục tiêu được chỉ định. Nếu không chỉ định chế độ hiển thị, tệp sẽ
sẽ hiển thị với mọi gói, ngay cả khi chế độ hiển thị mặc định của gói là
được chỉ định trong package
. Giấy phép
cũng có thể được chỉ định.
Ví dụ:
Ví dụ sau đây xuất golden.txt
, một
tệp văn bản từ gói test_data
để các dịch vụ
các gói có thể sử dụng thuộc tính này, ví dụ như trong thuộc tính data
kiểm thử.
# from //test_data/BUILD exports_files(["golden.txt"])
hình cầu
glob(include, exclude=[], exclude_directories=1, allow_empty=True)
Glob là một hàm trợ giúp giúp 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 mới, có thể thay đổi và được sắp xếp theo thứ tự các đường dẫn của chúng. Chỉ xoá cụm từ tìm kiếm tệp trong gói riêng và chỉ tìm các tệp nguồn (không phải các tệp được tạo hoặc các mục tiêu khác).
Nhãn của tệp nguồn được đưa vào kết quả nếu thuộc tính gói tương đối của tệp
đường dẫn nào khớp với bất kỳ mẫu include
nào và không có mẫu nào
exclude
mẫu.
Danh sách include
và exclude
chứa các mẫu đường dẫn
liên quan đến gói hiện tại. Mỗi mẫu có thể bao gồm một hoặc
các phân đoạn đường dẫn khác. Như thường lệ với đường dẫn Unix, các phân đoạn này được phân tách bằng
/
. Các phân đoạn có thể chứa ký tự đại diện *
: đoạn này khớp với
bất kỳ chuỗi con nào trong phân đoạn đường dẫn (ngay cả chuỗi con trống), ngoại trừ
dòng phân cách thư mục /
. Ký tự đại diện này có thể dùng nhiều lần
trong một phân đoạn đường dẫn. Ngoài ra, ký tự đại diện **
có thể khớp
không có hoặc có nhiều phân đoạn đường dẫn hoàn chỉnh, nhưng bạn phải khai báo chúng dưới dạng một phân đoạn độc lập
đường dẫn.
foo/bar.txt
khớp chính xác với tệpfoo/bar.txt
trong gói hàng nàyfoo/*.txt
khớp với mọi tệp trong thư mụcfoo/
nếu tệp kết thúc bằng.txt
(trừ phifoo/
là một gói con)foo/a*.htm*
khớp với mọi tệp trongfoo/
thư mục bắt đầu bằnga
, sau đó có một chuỗi tuỳ ý (có thể để trống), sau đó có.htm
và kết thúc bằng một chuỗi tuỳ ý khác; chẳng hạn nhưfoo/axx.htm
vàfoo/a.html
hoặcfoo/axxx.html
**/a.txt
khớp với mọia.txt
tệp trong mỗi thư mục con của gói này**/bar/**/*.txt
khớp với mọi.txt
tệp trong mỗi thư mục con của gói này, nếu có ít nhất một thư mục trên đường dẫn kết quả là có tên làbar
, chẳng hạn nhưxxx/bar/yyy/zzz/a.txt
hoặcbar/a.txt
(xin lưu ý rằng**
cũng khớp với 0 phân khúc) hoặcbar/zzz/a.txt
**
khớp với mọi tệp trong mọi thư mục con của tệp này gói hàngfoo**/a.txt
là mẫu không hợp lệ vì**
phải đứng riêng lẻ như một phân đoạn
Nếu đối số exclude_directories
được bật (đặt thành 1), các tệp của
thư mục type sẽ bị bỏ qua khỏi kết quả (mặc định là 1).
Nếu đối số allow_empty
được đặt thành False
,
Hàm glob
sẽ gặp lỗi nếu kết quả là
danh sách trống.
Có một số giới hạn và cảnh báo quan trọng:
-
Vì
glob()
chạy trong quá trình đánh giá tệp BUILD,glob()
chỉ khớp với các tệp trong cây nguồn, không bao giờ tệp được tạo. Nếu bạn đang xây dựng một mục tiêu yêu cầu cả tệp nguồn và tệp được tạo, bạn phải thêm vào danh sách rõ ràng các tệp vào cụm từ tìm kiếm. Xem ví dụ bên dưới với:mylib
và:gen_java_srcs
. -
Nếu một quy tắc có cùng tên với tệp nguồn phù hợp, thì quy tắc đó sẽ "bóng" tệp.
Để hiểu điều này, hãy nhớ rằng
glob()
trả về danh sách đường dẫn của Google, vì vậy, việc sử dụngglob()
trong các quy tắc khác (ví dụ:srcs = glob(["*.cc"])
) có tác dụng tương tự như việc liệt kê đường dẫn phù hợp một cách rõ ràng. Ví dụ: nếuglob()
có lợi nhuận["Foo.java", "bar/Baz.java"]
, nhưng cũng có một quy tắc trong gói có tên "Foo.java" (điều này được phép, mặc dù Bazel có cảnh báo về điều này), thì người dùngglob()
sẽ sử dụng "Foo.java" quy tắc (kết quả) thay vì "Foo.java" . Xem GitHub vấn đề #10395 để biết thêm chi tiết. - Tệp hình ảnh có thể khớp với các tệp trong thư mục con. Và tên thư mục con có thể có ký tự đại diện. Tuy nhiên...
-
Nhãn không được phép vượt qua ranh giới gói và hình cầu thì không khớp với tệp trong gói con.
Ví dụ: biểu thức toàn cầu
**/*.cc
trong góix
không bao gồmx/y/z.cc
nếux/y
tồn tại dưới dạng một gói (có thể làx/y/BUILD
hoặc vị trí khác trên đường dẫn gói). Chiến dịch này có nghĩa là kết quả của biểu thức cầu vồng thực sự phụ thuộc vào sự tồn tại của tệp BUILD — tức là, cùng một biểu thức cầu nối sẽ bao gồmx/y/z.cc
nếu không có gói nào được gọix/y
hoặc mục đã được đánh dấu là đã xóa bằng cách sử dụng --deleted_packages cờ. - Quy định hạn chế ở trên áp dụng cho tất cả biểu thức toàn cầu, bất kể ký tự đại diện nào chúng sử dụng.
-
Tệp ẩn có tên tệp bắt đầu bằng
.
hoàn toàn khớp với cả ký tự đại diện**
và*
. Nếu bạn muốn so khớp với một tệp ẩn có kiểu phức hợp, thì mẫu của bạn cần phải bắt đầu bằng.
. Ví dụ:*
và.*.txt
sẽ khớp với.foo.txt
, nhưng*.txt
thì không. Các thư mục ẩn cũng được so khớp theo cách tương tự. Thư mục ẩn có thể bao gồm những tệp không được yêu cầu làm dữ liệu đầu vào và có thể tăng số lượng tệp được sao lưu không cần thiết và mức sử dụng bộ nhớ. Để loại trừ thư mục ẩn, hãy thêm chúng vào trường "loại trừ" đối số danh sách. -
"**" ký tự đại diện có một kiểu viết hoa góc: hoa văn
"**"
không khớp với đường dẫn thư mục của gói. Tức là giả sửglob(["**"], exclude_directories = 0)
khớp với tất cả các tệp và các thư mục theo cách bắc cầu, hoàn toàn thuộc thư mục của gói hiện tại (nhưng tất nhiên sẽ không đi vào thư mục của các gói con – hãy xem gói hãy lưu ý về điều đó).
Nói chung, bạn nên thử cung cấp tiện ích mở rộng thích hợp (ví dụ: *.html) thay vì sử dụng dấu '*' đơn thuần cho mẫu cầu đường. Tên rõ ràng hơn vừa tự ghi lại vừa đảm bảo rằng bạn không vô tình so khớp bản sao lưu tệp, hoặc emacs/vi/... tệp tự động lưu.
Khi viết các quy tắc bản dựng, bạn có thể liệt kê các phần tử của khối cầu. Chiến dịch này cho phép tạo quy tắc riêng cho mọi dữ liệu đầu vào. Xem ví dụ về cụm từ tìm kiếm mở rộng ở bên dưới.
Ví dụ về ánh sáng loá
Tạo một thư viện Java được xây dựng từ tất cả các tệp java trong thư mục này,
và tất cả tệp do quy tắc :gen_java_srcs
tạo.
java_library( name = "mylib", srcs = glob(["*.java"]) + [":gen_java_srcs"], deps = "...", ) genrule( name = "gen_java_srcs", outs = [ "Foo.java", "Bar.java", ], ... )
Bao gồm tất cả các tệp txt trong dữ liệu kiểm thử thư mục, ngoại trừ tệp experiment.txt. Lưu ý rằng các tệp trong thư mục con của dữ liệu kiểm thử sẽ không được đưa vào. Nếu mà bạn muốn đưa những tệp đó vào, hãy sử dụng khối cầu hồi quy (**).
sh_test( name = "mytest", srcs = ["mytest.sh"], data = glob( ["testdata/*.txt"], exclude = ["testdata/experimental.txt"], ), )
Ví dụ về vòng tròn đệ quy
Đảm bảo chương trình kiểm thử phụ thuộc vào tất cả các tệp txt trong thư mục dữ liệu kiểm thử và bất kỳ tệp nào của các thư mục con (và thư mục con của chúng, v.v.). Các thư mục con chứa tệp BUILD sẽ bị bỏ qua. (Xem các giới hạn và cảnh báo ở trên.)
sh_test( name = "mytest", srcs = ["mytest.sh"], data = glob(["testdata/**/*.txt"]), )
Tạo một thư viện được xây dựng từ tất cả các tệp java trong thư mục này và tất cả thư mục con ngoại trừ những thư mục có đường dẫn bao gồm một thư mục có tên là kiểm thử. Bạn nên tránh dùng mẫu này nếu có thể vì mẫu này có thể làm giảm bản dựng và do đó tăng thời gian xây dựng.
java_library( name = "mylib", srcs = glob( ["**/*.java"], exclude = ["**/testing/**"], ), )
Ví dụ về băng thông rộng mở rộng
Tạo một quy tắc tạo riêng cho *_test.cc trong thư mục hiện tại để đếm số dòng trong tệp.
# Conveniently, the build language supports list comprehensions. [genrule( name = "count_lines_" + f[:-3], # strip ".cc" srcs = [f], outs = ["%s-linecount.txt" % f[:-3]], cmd = "wc -l $< >$@", ) for f in glob(["*_test.cc"])]
Nếu tệp BUILD ở trên nằm trong gói //foo và gói chứa ba
tệp phù hợp, a_test.cc, b_test.cc và c_test.cc rồi chạy
bazel query '//foo:all'
sẽ liệt kê tất cả những quy tắc đã được tạo:
$ bazel query '//foo:all' | sort //foo:count_lines_a_test //foo:count_lines_b_test //foo:count_lines_c_test
chọn
select( {conditionA: valuesA, conditionB: valuesB, ...}, no_match_error = "custom message" )
select()
là hàm trợ giúp tạo thuộc tính quy tắc
có thể định cấu hình.
Tham số này có thể thay thế phía bên phải của
gần như
mọi thao tác gán thuộc tính vì vậy giá trị của thuộc tính đó phụ thuộc vào cờ Bazel dòng lệnh.
Ví dụ: bạn có thể sử dụng đoạn mã này để xác định các phần phụ thuộc dành riêng cho nền tảng hoặc để
nhúng các tài nguyên khác nhau tuỳ thuộc vào việc quy tắc có được tạo trong "nhà phát triển" hay không
so với "release" .
Dưới đây là cách sử dụng cơ bản:
sh_binary( name = "mytarget", srcs = select({ ":conditionA": ["mytarget_a.sh"], ":conditionB": ["mytarget_b.sh"], "//conditions:default": ["mytarget_default.sh"] }) )
Điều này khiến thuộc tính srcs
của
sh_binary
có thể định cấu hình bằng cách thay thế nhãn thông thường của nó
liệt kê bài tập có lệnh gọi select
liên kết
điều kiện cấu hình với các giá trị phù hợp. Mỗi điều kiện là một nhãn
tham chiếu đến
config_setting
hoặc
constraint_value
,
"khớp" nếu cấu hình của mục tiêu khớp với tập hợp
giá trị. Sau đó, giá trị của mytarget#srcs
sẽ trở thành giá trị bất kỳ
danh sách nhãn khớp với lệnh gọi hiện tại.
Lưu ý:
- Chỉ cần chọn đúng một điều kiện trên mọi lệnh gọi.
- Nếu có nhiều điều kiện trùng khớp và một điều kiện là chuyên môn của các điều kiện khác, thì chuyên môn sẽ được ưu tiên. Điều kiện B được coi là chuyên môn hoá điều kiện A nếu B có tất cả cờ và quy tắc ràng buộc giống nhau dưới dạng A cộng với một số cờ hoặc giá trị ràng buộc bổ sung. Việc này cũng có nghĩa là quá trình phân giải chuyên môn không được thiết kế để tạo thứ tự như được minh hoạ trong Ví dụ 2 bên dưới.
- Nếu nhiều điều kiện trùng khớp và một điều kiện không phải là chuyên môn của tất cả nếu không, Bazel sẽ gặp lỗi, trừ khi mọi điều kiện đều trở về cùng một giá trị.
- Nhãn giả đặc biệt
//conditions:default
là được cân nhắc khớp nếu không có điều kiện nào khác khớp. Nếu điều kiện này bị bỏ qua, một số quy tắc khác phải phù hợp để tránh lỗi. select
có thể được nhúng bên trong gán thuộc tính. Vì vậy,srcs = ["common.sh"] + select({ ":conditionA": ["myrule_a.sh"], ...})
vàsrcs = select({ ":conditionA": ["a.sh"]}) + select({ ":conditionB": ["b.sh"]})
là biểu thức hợp lệ.select
hoạt động với hầu hết (nhưng không phải tất cả) thuộc tính. Không tương thích được đánh dấu lànonconfigurable
trong tài liệu tương ứng.gói con
subpackages(include, exclude=[], allow_empty=True)
subpackages()
là một hàm trợ giúp, tương tự nhưglob()
liệt kê các gói con thay vì tệp và thư mục. Chiến dịch này sử dụng cùng một đường dẫn dưới dạngglob()
và có thể khớp với bất kỳ gói con nào là thành phần con trực tiếp của tệp BUILD đang tải. Xem phần glob để biết nội dung giải thích chi tiết và các ví dụ về phần bao gồm và loại trừ mẫu.Danh sách kết quả của các gói con được trả về theo thứ tự được sắp xếp và chứa đường dẫn tương ứng với gói tải hiện tại khớp với các mẫu đã cho trong
include
chứ không phải các URL trongexclude
.Ví dụ:
Ví dụ sau đây liệt kê tất cả các gói con trực tiếp cho gói
foo/BUILD
# The following BUILD files exist: # foo/BUILD # foo/bar/baz/BUILD # foo/sub/BUILD # foo/sub/deeper/BUILD # # In foo/BUILD a call to subs = subpackages(include = ["**"]) # results in subs == ["sub", "bar/baz"] # # 'sub/deeper' is not included because it is a subpackage of 'foo/sub' not of # 'foo'
Nhìn chung, bạn nên ưu tiên gọi hàm này thay vì trực tiếp gọi hàm này mà người dùng sử dụng mô-đun của skylib.