Nhãn

Sử dụng bộ sưu tập để sắp xếp ngăn nắp các trang Lưu và phân loại nội dung dựa trên lựa chọn ưu tiên của bạn.
Báo cáo vấn đề Xem nguồn

Mọi mục tiêu đều thuộc về một gói duy nhất. Tên của mục tiêu được gọi là nhãn. Mỗi nhãn chỉ xác định một mục tiêu duy nhất. Nhãn thông thường ở dạng chính tắc 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 mà một 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 liên quan đến 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 sẽ cùng 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 sử dụng, thì tên gói (và dấu hai chấm) 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 những 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 quy tắc, nhưng không có ý nghĩa đá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, bạn có thể bỏ qua thành phần đó và dấu hai chấm. Vì vậy, 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). Vì vậy, 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@some_repo//my/app có hai ý nghĩa tuỳ thuộc vào ngữ cảnh được sử dụng: khi Bazel dự kiến có nhãn, các từ khoá này có nghĩa là //my/app:app@some_repo//my/app:app. Tuy nhiên, khi Bazel mong đợi một gói hàng (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 các tệp BUILD là sử dụng //my/app để tham chiếu đến một gói hoặc tất cả mục tiêu trong một gói. Hãy nhớ rằng mã này tương đương với //my/app:app, vì vậy mã này đặ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, việc sử dụng //my/app để tham chiếu đến một gói được khuyến khích trong quy cách package_group hoặc trong các tệp .bzl vì nó truyền đạt rõ ràng rằng tên gói là tuyệt đối và được can thiệp vào thư mục cấp cao nhất của 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 tệp có tên testdepot.zip. Sau đây là hai cách (một cách sai, một cách chính xác) để tham chiếu đến tệp này trong //my/app:BUILD:

Saitestdata 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

Đúng — tham chiếu đến testdata bằng đườ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. Các 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. Thư mục cũ đề cập đến kho lưu trữ chính, còn kho lưu trữ thứ hai 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 ghi các quy tắc 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 từ các 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 các mẫu mục tiêu.

Quy cách từ vựng 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 giá trị shell. Điều này giúp tránh các vấn đề trích dẫn vô tình và giúp bạn dễ dàng tạo các công cụ và tập lệnh có chức năng điều khiển 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 vẽ từ nhóm az, AZ, 09 và 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à tên không được bắt đầu hoặc kết thúc bằng dấu gạch chéo (ví dụ: /foofoo/ bị cấm) và 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 tham 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 sử dụng `.` để tham chiếu đến các tệp trong các gói khác

Sửa – Sử dụng `//package-name:filename`

Mặc dù bạn nên sử dụng / trong tên của mục tiêu tệp, hãy tránh sử dụng / trong tên của các quy tắc. Đặc biệt, khi sử dụng dạng viết tắt của nhãn, nội dung đó 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 như vậy; nhãn này không bao giờ đề cập đến //foo:bar/wiz, ngay cả khi mục tiêu đó tồn tại.

Tuy nhiên, có một số trường hợp mà việc sử dụng dấu gạch chéo sẽ thuận tiện hoặc thậm chí là 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ó 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, so 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ộ các ký tự được vẽ từ nhóm A-Z, az, 09, '/', '-', '.', '@' và '_' và không được bắt đầu bằng dấu gạch chéo.

Đối với một 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), bạn 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 là 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 // hoặ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 các đầu vào và đầu ra, cũng như các bước để tạo ra các đầu ra. Quy tắc có thể là một trong nhiều loại khác nhau (đôi khi được gọi là lớp quy tắc). Lớp này tạo ra các tệp thực thi và thư viện được biên dịch, kiểm thử tệp thực thi và các kết quả đầu ra khác được hỗ trợ như mô tả trong Bách khoa toàn thư về bản dựng.

Tệp BUILD khai báo mục tiêu bằng cách gọi quy tắc.

Trong ví dụ bên dưới, chúng ta thấy khai báo của 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à tên mục tiêu hợp lệ) để khai báo mục tiêu trong gói tệp BUILD.

Mỗi quy tắc đều 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 và tầm quan trọng và ngữ nghĩa của từng thuộc tính là một chức năng của loại quy tắc đó. Hãy xem Quy tắc bách khoa bản dựng để biết danh sách các quy tắc và thuộc tính tương ứng. Mỗi thuộc tính có một tên và một loại. Một số loại thuộc tính phổ biến 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 tạo thành một từ điển từ khoá (tên) đến các giá trị không bắt buộc và đã 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 đầ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 hơi tùy ý và thú vị hơn là tên của các tệp được tạo bởi quy tắc và điều này đúng là do các quy tắc tạo ra. Để biết thêm thông tin, hãy xem Quy tắc chung: genrule.

Trong các trường hợp khác, tên này rất quan trọng: ví dụ: đối với các quy tắc *_binary*_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 chu trình định hướng này nhắm đế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 bản dựng, đồng thời là miền mà công cụ Truy vấn Bazel hoạt động.

Mục tiêu XÂY DỰNG Tệp