Tất cả mục tiêu thuộc về đúng một gói. Tên của mục tiêu được gọi là nhãn. Mỗi nhãn đều xác định một mục tiêu duy nhất. Nhãn thông thường ở dạng chuẩn sẽ có dạng như sau:
@myrepo//my/app/main:app_binary
Phần đầu tiên của nhãn là tên kho lưu trữ, @myrepo//
.
Trong trường hợp thông thường, nhãn đề cập đến cùng một kho lưu trữ mà nhãn đó được sử dụng, thì giá trị nhận dạng kho lưu trữ có thể được viết tắt là //
.
Vì vậy, bên trong @myrepo
nhãn này thường được viết là
//my/app/main:app_binary
Phần thứ hai của nhãn là tên gói không đủ điều kiện my/app/main
, đường dẫn đến gói tương ứng với thư mục gốc của kho lưu trữ. Tên kho lưu trữ và tên gói
không đủ điều kiện cùng nhau sẽ tạo thành tên gói đủ điều kiện
@myrepo//my/app/main
. Khi nhãn đề cập đến cùng một gói được dùng, thì tên gói (và cả dấu hai chấm nếu muốn) có thể bị bỏ qua. Vì vậy, bên trong @myrepo//my/app/main
,
nhãn này có thể được viết theo một trong các cách sau:
app_binary
:app_binary
Vấn đề là theo quy ước, dấu hai chấm sẽ bị bỏ qua đối với các tệp, nhưng vẫn được giữ lại cho các quy tắc, nhưng không đáng kể.
Phần của nhãn sau dấu hai chấm, app_binary
là tên mục tiêu không đủ điều kiện. Khi khớp với thành phần cuối cùng của đường dẫn gói, thành phần này và dấu hai chấm có thể bị bỏ qua. Do đó, hai nhãn này tương đương nhau:
//my/app/lib
//my/app/lib:lib
Tên của mục tiêu tệp trong thư mục con của gói là đường dẫn của tệp tương ứng với thư mục gốc của gói (thư mục chứa tệp BUILD
). Do đó, tệp này nằm trong thư mục con my/app/main/testdata
của kho lưu trữ:
//my/app/main:testdata/input.txt
Các chuỗi như //my/app
và @some_repo//my/app
có hai ý nghĩa tuỳ thuộc vào ngữ cảnh mà các chuỗi đó được sử dụng: khi Bazel muốn gán nhãn, thì các chuỗi này lần lượt là //my/app:app
và @some_repo//my/app:app
. Tuy nhiên, khi Bazel kỳ vọng một gói (ví dụ: trong thông số kỹ thuật của package_group
), họ sẽ tham chiếu đến gói chứa nhãn đó.
Một lỗi phổ biến trong tệp BUILD
là sử dụng //my/app
để tham chiếu đến một gói hoặc
tất cả các mục tiêu trong một gói – việc này thì không. Hãy nhớ hàm này tương đương với //my/app:app
, vì vậy nó đặt tên cho mục tiêu app
trong gói my/app
của kho lưu trữ hiện tại.
Tuy nhiên, bạn nên sử dụng //my/app
để tham chiếu đến một gói trong thông số kỹ thuật của package_group
hoặc trong các tệp .bzl
, vì tên này truyền đạt rõ ràng rằng tên gói là tuyệt đối và bắt nguồn từ thư mục cấp cao nhất trong không gian làm việc.
Bạn không thể sử dụng nhãn tương đối để tham chiếu đến mục tiêu trong các gói khác; trong trường hợp này, bạn phải luôn chỉ định giá trị nhận dạng kho lưu trữ và tên gói.
Ví dụ: nếu cây nguồn chứa cả gói my/app
và gói my/app/testdata
(mỗi thư mục trong số hai thư mục này đều có tệp BUILD
riêng), thì gói sau sẽ chứa một tệp có tên testdepot.zip
. Dưới đây là hai cách (sai, đúng) tham chiếu đến tệp này trong //my/app:BUILD
:
Sai — testdata
là một gói khác nên bạn không thể sử dụng đường dẫn tương đối
testdata/testdepot.zip
Chính xác — tham chiếu đến testdata
với đường dẫn đầy đủ
//my/app/testdata:testdepot.zip
Các nhãn bắt đầu bằng @//
là các tệp tham chiếu đến kho lưu trữ chính, nhãn này vẫn sẽ hoạt động ngay cả từ các kho lưu trữ bên ngoài.
Do đó, @//a/b/c
khác với //a/b/c
khi được tham chiếu từ một kho lưu trữ bên ngoài.
Quy tắc trước đây đề cập đến kho lưu trữ chính, trong khi quy trình sau sẽ tìm kiếm //a/b/c
trong chính kho lưu trữ bên ngoài.
Điều này đặc biệt phù hợp khi các quy tắc ghi trong kho lưu trữ chính tham chiếu đến các mục tiêu trong kho lưu trữ chính và sẽ được sử dụng trong kho lưu trữ bên ngoài.
Để biết thông tin về các cách tham chiếu mục tiêu, hãy xem mẫu mục tiêu.
Thông số kỹ thuật của nhãn
Cú pháp nhãn không khuyến khích sử dụng các siêu ký tự có ý nghĩa đặc biệt đối với shell. Điều này giúp tránh các vấn đề trích dẫn vô tình và giúp dễ dàng xây dựng các công cụ và tập lệnh thao túng nhãn, chẳng hạn như Ngôn ngữ truy vấn Bazel.
Dưới đây là thông tin chi tiết chính xác về tên mục tiêu được phép.
Tên mục tiêu — package-name:target-name
target-name
là tên của mục tiêu trong gói. Tên của một quy tắc là giá trị của thuộc tính name
trong nội dung khai báo của quy tắc trong tệp BUILD
; tên của tệp là tên đường dẫn tương ứng với thư mục chứa tệp BUILD
.
Tên mục tiêu phải bao gồm toàn bộ ký tự được lấy từ nhóm a
–z
,
A
–Z
, 0
– 9
và các ký hiệu dấu câu !%-@^_"#$&'()*-+,;<=>?[]{|}~/.
.
Tên tệp phải là tên đường dẫn tương đối ở dạng thông thường, tức là chúng không được bắt đầu cũng như kết thúc bằng dấu gạch chéo (ví dụ: /foo
và foo/
bị cấm) cũng như không chứa nhiều dấu gạch chéo liên tiếp dưới dạng dấu phân tách đường dẫn (ví dụ: foo//bar
). Tương tự, tệp đối chiếu cấp cao (..
) và tệp tham chiếu thư mục hiện tại (./
) đều bị cấm.
Sai – Không dùng `..` để tham chiếu đến tệp trong các gói khác
Đúng – Sử dụng `//package-name:filename`
Dù việc dùng /
trong tên mục tiêu tệp là phổ biến, nhưng hãy tránh sử dụng
/
trong tên của các quy tắc. Đặc biệt là khi sử dụng dạng viết tắt của nhãn, điều này có thể gây nhầm lẫn cho người đọc. Nhãn //foo/bar/wiz
luôn là viết tắt của //foo/bar/wiz:wiz
, ngay cả khi không có gói foo/bar/wiz
nào như vậy; nhãn chưa bao giờ tham chiếu đến //foo:bar/wiz
, ngay cả khi mục tiêu đó tồn tại.
Tuy nhiên, trong một số trường hợp, việc sử dụng dấu gạch chéo rất thuận tiện, hoặc đôi khi cần thiết. Ví dụ: tên của một số quy tắc phải khớp với tệp nguồn chính, các tệp này có thể nằm trong thư mục con của gói.
Tên gói – //package-name:target-name
Tên của một gói là tên của thư mục chứa tệp BUILD
,
tương ứng với thư mục cấp cao nhất của kho lưu trữ chứa.
Ví dụ: my/app
.
Tên gói phải bao gồm toàn bộ ký tự được vẽ từ nhóm
A
-Z
, a
–z
, 0
–9
, '/
', '-
', '.
', '@
' và '_
' và không được
bắt đầu bằng dấu gạch chéo.
Đối với ngôn ngữ có cấu trúc thư mục quan trọng đối với hệ thống mô-đun (ví dụ: Java), điều quan trọng là cần chọn tên thư mục là giá trị nhận dạng hợp lệ trong ngôn ngữ đó.
Mặc dù Bazel hỗ trợ các mục tiêu trong gói gốc của không gian làm việc (ví dụ: //:foo
), nhưng tốt nhất bạn nên để trống gói đó để tất cả các gói có ý nghĩa đều có tên mô tả.
Tên gói không được chứa chuỗi con //
và cũng không được kết thúc bằng dấu gạch chéo.
Quy tắc
Quy tắc chỉ định mối quan hệ giữa đầu vào và đầu ra, cũng như các bước để tạo đầu ra. Các quy tắc có thể thuộc một trong nhiều loại (đôi khi được gọi là lớp quy tắc). Quy tắc này tạo ra các tệp thực thi và thư viện đã biên dịch, kiểm thử các tệp thực thi và những đầu ra được hỗ trợ khác như mô tả trong Tạo bách khoa toàn thư.
Tệp BUILD
khai báo mục tiêu bằng cách gọi các quy tắc.
Trong ví dụ bên dưới, chúng ta thấy phần khai báo mục tiêu my_app
bằng cách sử dụng quy tắc cc_binary
.
cc_binary(
name = "my_app",
srcs = ["my_app.cc"],
deps = [
"//absl/base",
"//absl/strings",
],
)
Mỗi lệnh gọi quy tắc có một thuộc tính name
(phải là một tên mục tiêu hợp lệ), khai báo mục tiêu trong gói của tệp BUILD
.
Mỗi quy tắc có một bộ thuộc tính; các thuộc tính áp dụng cho một quy tắc nhất định, ý nghĩa và ngữ nghĩa của mỗi thuộc tính là một hàm thuộc loại của quy tắc đó; hãy xem Build Bách khoa toàn thư để biết danh sách các quy tắc và thuộc tính tương ứng của chúng. Mỗi thuộc tính có một tên và một loại. Một số loại phổ biến của một thuộc tính có thể có là số nguyên, nhãn, danh sách nhãn, chuỗi, danh sách chuỗi, nhãn đầu ra, danh sách nhãn đầu ra. Bạn không cần phải chỉ định tất cả thuộc tính trong mọi quy tắc. Do đó, các thuộc tính sẽ tạo thành một từ điển từ khoá (tên) đến các giá trị không bắt buộc, được nhập.
Thuộc tính srcs
hiển thị trong nhiều quy tắc có loại "danh sách nhãn"; giá trị của thuộc tính này, nếu có, là danh sách các nhãn, mỗi nhãn là tên của một mục tiêu là dữ liệu đầu vào cho quy tắc này.
Trong một số trường hợp, tên của loại quy tắc có phần tùy ý và thú vị hơn là tên của các tệp do quy tắc tạo và điều này đúng với quy tắc tạo gen. Để biết thêm thông tin, xem Quy tắc chung: genrule.
Trong các trường hợp khác, tên rất quan trọng: ví dụ: đối với quy tắc *_binary
và *_test
, tên quy tắc xác định tên của tệp thực thi do bản dựng tạo ra.
Biểu đồ không theo chu kỳ được định hướng này trên các mục tiêu được gọi là biểu đồ mục tiêu hoặc biểu đồ phần phụ thuộc của bản dựng và là miền mà Công cụ truy vấn Bazel hoạt động.
Mục tiêu | XÂY DỰNG Tệp |