Lệnh sửa đổi

Báo cáo sự cố Xem nguồn

Lệnh mod ra mắt trong Bazel 6.3.0, cung cấp một loạt công cụ giúp người dùng hiểu biểu đồ phần phụ thuộc bên ngoài khi Bzlmod được bật. Tệp này cho phép bạn trực quan hoá biểu đồ phần phụ thuộc, tìm hiểu lý do tại sao một mô-đun hoặc phiên bản của một mô-đun nhất định lại xuất hiện trong biểu đồ, xem định nghĩa kho lưu trữ sao lưu các mô-đun, kiểm tra việc sử dụng các phần mở rộng và kho lưu trữ mô-đun mà chúng tạo ra, cùng với các hàm khác.

Cú pháp

bazel mod <subcommand> [<options>] [<arg> [<arg>...]]

Các lệnh con có sẵn và các đối số bắt buộc tương ứng của chúng là:

  • graph: Hiển thị biểu đồ phần phụ thuộc đầy đủ của dự án, bắt đầu từ mô-đun gốc. Nếu một hoặc nhiều mô-đun được chỉ định trong --from, thì các mô-đun này sẽ hiển thị ngay dưới thư mục gốc và biểu đồ chỉ được mở rộng kể từ các mô-đun đó (xem ví dụ).

  • deps <arg>...: Hiển thị các phần phụ thuộc trực tiếp đã được phân giải của từng mô-đun đã chỉ định, tương tự như graph.

  • all_paths <arg>...: Hiển thị tất cả đường dẫn hiện có từ thư mục gốc đến <arg>... được chỉ định. Nếu một hoặc nhiều mô-đun được chỉ định trong --from, thì những mô-đun này sẽ hiển thị ngay dưới thư mục gốc và biểu đồ chứa mọi đường dẫn hiện có từ mô-đun --from đến mô-đun đối số (xem ví dụ).

  • path <arg>...: Có cùng ngữ nghĩa như all_paths, nhưng chỉ hiển thị một đường dẫn duy nhất từ một trong các mô-đun --from đến một trong các mô-đun đối số.

  • explain <arg>...: Hiển thị tất cả vị trí mà các mô-đun được chỉ định xuất hiện trong biểu đồ phần phụ thuộc, cùng với các mô-đun phụ thuộc trực tiếp vào các mô-đun đó. Kết quả đầu ra của lệnh explain về cơ bản là phiên bản được cắt bớt của lệnh all_paths, chứa 1) mô-đun gốc; 2) các phần phụ thuộc trực tiếp của mô-đun gốc dẫn đến các mô-đun đối số; 3) phần phụ thuộc trực tiếp của mô-đun đối số; và 4) chính các mô-đun đối số (xem ví dụ).

  • show_repo <arg>...: Hiển thị định nghĩa của các kho lưu trữ được chỉ định (xem ví dụ).

  • show_extension <extension>...: Hiển thị thông tin về từng tiện ích đã chỉ định: danh sách các kho lưu trữ đã tạo cùng với các mô-đun nhập các tiện ích đó bằng use_repo và danh sách cách sử dụng tiện ích đó trong từng mô-đun mà tiện ích được sử dụng, chứa các thẻ và lệnh gọi use_repo được chỉ định (xem ví dụ).

<arg> đề cập đến một hoặc nhiều mô-đun hay kho lưu trữ. Đó có thể là một trong những cách sau:

  • Chuỗi ký tự <root>: Mô-đun gốc đại diện cho dự án hiện tại của bạn.

  • <name>@<version>: Mô-đun <name> ở phiên bản <version>. Đối với một mô-đun có cơ chế ghi đè không phải tên đăng ký, hãy sử dụng dấu gạch dưới (_) làm <version>.

  • <name>: Tất cả các phiên bản hiện tại của mô-đun <name>.

  • @<repo_name>: Kho lưu trữ có tên apparent đã cho trong ngữ cảnh của --base_module.

  • @@<repo_name>: Kho lưu trữ có tên chính tắc đã cho.

Trong ngữ cảnh yêu cầu chỉ định mô-đun, bạn cũng có thể sử dụng <arg> tham chiếu đến repos tương ứng với mô-đun (trái ngược với kho lưu trữ do tiện ích tạo). Ngược lại, trong ngữ cảnh yêu cầu chỉ định repos, các <arg> tham chiếu đến các mô-đun có thể thay thế cho các kho lưu trữ tương ứng.

<extension> phải có dạng <arg><label_to_bzl_file>%<extension_name>. Phần <label_to_bzl_file> phải là một nhãn tương đối lưu trữ (ví dụ: //pkg/path:file.bzl).

Các tuỳ chọn sau đây chỉ ảnh hưởng đến các lệnh con in biểu đồ (graph, deps, all_paths, pathexplain):

  • --from <arg>[,<arg>[,...]] mặc định: <root>: (Các) mô-đun mà biểu đồ được mở rộng trong graph, all_paths, pathexplain. Hãy kiểm tra phần mô tả của các lệnh con để biết thêm chi tiết.

  • --verbose default: "false": Đưa thông tin bổ sung vào biểu đồ đầu ra về độ phân giải của phiên bản của mỗi mô-đun. Nếu phiên bản mô-đun thay đổi trong quá trình phân giải, hãy cho biết phiên bản nào đã thay thế hoặc phiên bản gốc là gì, lý do thay thế và mô-đun nào đã yêu cầu phiên bản mới nếu lý do là Lựa chọn phiên bản tối thiểu.

  • --include_unused default: "false": Đưa các mô-đun ban đầu có trong biểu đồ phần phụ thuộc vào biểu đồ đầu ra, nhưng không được sử dụng sau khi phân giải mô-đun.

  • --extension_info <mode>: Đưa thông tin về việc sử dụng tiện ích mô-đun vào biểu đồ đầu ra (xem ví dụ). <mode> có thể là một trong những trạng thái sau đây:

    • hidden (mặc định): Không hiển thị bất kỳ nội dung nào về tiện ích.

    • usages: Hiển thị các tiện ích trong từng mô-đun mà các tiện ích đó được sử dụng. Các đối tượng này được in dưới dạng $<extension>.

    • repos: Ngoài usages, hãy hiển thị kho lưu trữ được nhập bằng use_repo trong mỗi lần sử dụng tiện ích.

    • all: Ngoài usagesrepos, hãy hiển thị các kho lưu trữ do tiện ích tạo chưa được nhập bởi bất kỳ mô-đun nào. Các kho lưu trữ bổ sung này hiển thị trong lần xuất hiện đầu tiên của tiện ích được tạo trong đầu ra và được kết nối với một cạnh chấm.

  • --extension_filter <extension>[,<extension>[,...]]: Nếu được chỉ định, biểu đồ đầu ra chỉ bao gồm các mô-đun sử dụng phần mở rộng đã chỉ định và các đường dẫn dẫn đến các mô-đun đó. Việc chỉ định danh sách phần mở rộng trống (như trong --extension_filter=) tương đương với việc chỉ định tất cả phần mở rộng mà mô-đun bất kỳ sử dụng trong biểu đồ phần phụ thuộc.

  • --depth <N>: Độ sâu của biểu đồ đầu ra. Độ sâu 1 chỉ hiển thị thư mục gốc và các phần phụ thuộc trực tiếp của thư mục gốc đó. Giá trị mặc định là 1 đối với explain, 2 đối với deps và giá trị vô hạn đối với các giá trị khác.

  • --cycles default: "false": Đưa các cạnh chu kỳ vào biểu đồ đầu ra.

  • --include_builtin default: "false": Đưa các mô-đun tích hợp sẵn (chẳng hạn như @bazel_tools) vào biểu đồ đầu ra. Cờ này bị tắt theo mặc định, vì các mô-đun tích hợp sẵn sẽ ngầm phụ thuộc vào mọi mô-đun khác, điều này làm lộn xộn đầu ra.

  • --charset <charset> default: utf8: Chỉ định bộ ký tự cần sử dụng cho đầu ra văn bản. Các giá trị hợp lệ là "utf8""ascii". Điểm khác biệt đáng kể duy nhất là các ký tự đặc biệt dùng để vẽ biểu đồ ở định dạng đầu ra "text", vốn không tồn tại trong bộ ký tự "ascii". Do đó, bộ ký tự "ascii" dùng để hỗ trợ việc sử dụng trên các nền tảng cũ không thể sử dụng Unicode.

  • --output <mode>: Đưa thông tin về việc sử dụng tiện ích mô-đun vào biểu đồ đầu ra. <mode> có thể là một trong những cách sau:

    • text (mặc định): Cách biểu diễn biểu đồ đầu ra mà con người có thể đọc được (được làm phẳng dưới dạng cây).

    • json: Xuất biểu đồ ở dạng đối tượng JSON (được làm phẳng dưới dạng cây).

    • graph: Xuất biểu đồ dưới dạng cách biểu diễn chấm Graphviz.

    bazel mod graph --output graph | dot -Tsvg > /tmp/graph.svg
    

Các lựa chọn khác bao gồm:

  • --base_module <arg> default: <root>: Chỉ định một mô-đun liên quan đến tên kho lưu trữ rõ ràng trong các đối số được diễn giải. Lưu ý rằng bản thân đối số này có thể ở dạng @<repo_name>; đối số này luôn được diễn giải tương ứng với mô-đun gốc.

  • --extension_usages <arg>[,<arg>[,...]]: Lọc show_extension để chỉ cho thấy việc sử dụng tiện ích từ các mô-đun đã chỉ định.

Ví dụ

Một số cách sử dụng lệnh mod có thể có trong một dự án Bazel thực tế được trình bày dưới đây nhằm cung cấp cho bạn ý tưởng chung về cách bạn có thể sử dụng lệnh này để kiểm tra các phần phụ thuộc bên ngoài của dự án.

Tệp MODULE.bazel:

module(
  name = "my_project",
  version = "1.0",
)

bazel_dep(name = "bazel_skylib", version = "1.1.1", repo_name = "skylib1")
bazel_dep(name = "bazel_skylib", version = "1.2.0", repo_name = "skylib2")
multiple_version_override(module_name = "bazel_skylib", versions = ["1.1.1", "1.2.0"])

bazel_dep(name = "stardoc", version = "0.5.0")
bazel_dep(name = "rules_java", version = "5.0.0")

toolchains = use_extension("@rules_java//java:extensions.bzl", "toolchains")
use_repo(toolchains, my_jdk="remotejdk17_linux")
Biểu đồ trước khi phân giải
Biểu đồ trước khi phân giải
Biểu đồ sau độ phân giải
Biểu đồ sau khi phân giải
  1. Hiển thị toàn bộ biểu đồ phần phụ thuộc của dự án.

    bazel mod graph
    
    <root> (my_project@1.0)
    ├───bazel_skylib@1.1.1
    │   └───platforms@0.0.4
    ├───bazel_skylib@1.2.0
    │   └───platforms@0.0.4 ...
    ├───rules_java@5.0.0
    │   ├───platforms@0.0.4 ...
    │   ├───rules_cc@0.0.1
    │   │   ├───bazel_skylib@1.1.1 ...
    │   │   └───platforms@0.0.4 ...
    │   └───rules_proto@4.0.0
    │       ├───bazel_skylib@1.1.1 ...
    │       └───rules_cc@0.0.1 ...
    └───stardoc@0.5.0
        ├───bazel_skylib@1.1.1 ...
        └───rules_java@5.0.0 ...
    
  2. Hiển thị toàn bộ biểu đồ phần phụ thuộc (bao gồm cả các mô-đun không sử dụng và thông tin bổ sung về độ phân giải của phiên bản).

    bazel mod graph --include_unused --verbose
    
    <root> (my_project@1.0)
    ├───bazel_skylib@1.1.1
    │   └───platforms@0.0.4
    ├───bazel_skylib@1.2.0
    │   └───platforms@0.0.4 ...
    ├───rules_java@5.0.0
    │   ├───platforms@0.0.4 ...
    │   ├───rules_cc@0.0.1
    │   │   ├───bazel_skylib@1.0.3 ... (to 1.1.1, cause multiple_version_override)
    │   │   ├───bazel_skylib@1.1.1 ... (was 1.0.3, cause multiple_version_override)
    │   │   └───platforms@0.0.4 ...
    │   └───rules_proto@4.0.0
    │       ├───bazel_skylib@1.0.3 ... (to 1.1.1, cause multiple_version_override)
    │       ├───bazel_skylib@1.1.1 ... (was 1.0.3, cause multiple_version_override)
    │       └───rules_cc@0.0.1 ...
    └───stardoc@0.5.0
        ├───bazel_skylib@1.1.1 ... (was 1.0.3, cause multiple_version_override)
        ├───rules_java@5.0.0 ... (was 4.0.0, cause <root>, bazel_tools@_)
        ├───bazel_skylib@1.0.3 (to 1.1.1, cause multiple_version_override)
        │   └───platforms@0.0.4 ...
        └───rules_java@4.0.0 (to 5.0.0, cause <root>, bazel_tools@_)
            ├───bazel_skylib@1.0.3 ... (to 1.1.1, cause multiple_version_override)
            └───bazel_skylib@1.1.1 ... (was 1.0.3, cause multiple_version_override)
    
  3. Hiển thị biểu đồ phần phụ thuộc được mở rộng từ một số mô-đun cụ thể.

    bazel mod graph --from rules_java --include_unused
    
    <root> (my_project@1.0)
    ├───rules_java@5.0.0
    │   ├───platforms@0.0.4
    │   ├───rules_cc@0.0.1
    │   │   ├───bazel_skylib@1.0.3 ... (unused)
    │   │   ├───bazel_skylib@1.1.1 ...
    │   │   └───platforms@0.0.4 ...
    │   └───rules_proto@4.0.0
    │       ├───bazel_skylib@1.0.3 ... (unused)
    │       ├───bazel_skylib@1.1.1 ...
    │       └───rules_cc@0.0.1 ...
    └╌╌rules_java@4.0.0 (unused)
        ├───bazel_skylib@1.0.3 (unused)
        │   └───platforms@0.0.4 ...
        └───bazel_skylib@1.1.1
            └───platforms@0.0.4 ...
    
  4. Hiển thị tất cả các đường dẫn giữa hai mô-đun.

    bazel mod all_paths bazel_skylib@1.1.1 --from rules_proto
    
    <root> (my_project@1.0)
    └╌╌rules_proto@4.0.0
        ├───bazel_skylib@1.1.1
        └───rules_cc@0.0.1
            └───bazel_skylib@1.1.1 ...
    
  5. Xem lý do và cách dự án của bạn phụ thuộc vào một số mô-đun.

    bazel mod explain @skylib1 --verbose --include_unused
    
    <root> (my_project@1.0)
    ├───bazel_skylib@1.1.1
    ├───rules_java@5.0.0
    │   ├───rules_cc@0.0.1
    │   │   └───bazel_skylib@1.1.1 ... (was 1.0.3, cause multiple_version_override)
    │   └───rules_proto@4.0.0
    │       ├───bazel_skylib@1.1.1 ... (was 1.0.3, cause multiple_version_override)
    │       └───rules_cc@0.0.1 ...
    └───stardoc@0.5.0
        ├───bazel_skylib@1.1.1 ... (was 1.0.3, cause multiple_version_override)
        ├╌╌rules_cc@0.0.1
        │   └───bazel_skylib@1.1.1 ... (was 1.0.3, cause multiple_version_override)
        └╌╌rules_proto@4.0.0
            ├───bazel_skylib@1.1.1 ... (was 1.0.3, cause multiple_version_override)
            └───rules_cc@0.0.1 ...
    
  6. Xem quy tắc cơ bản của một số kho lưu trữ mô-đun.

    bazel mod show_repo rules_cc stardoc
    
    ## rules_cc@0.0.1:
    # <builtin>
    http_archive(
      name = "rules_cc~",
      urls = ["https://bcr.bazel.build/test-mirror/github.com/bazelbuild/rules_cc/releases/download/0.0.1/rules_cc-0.0.1.tar.gz", "https://github.com/bazelbuild/rules_cc/releases/download/0.0.1/rules_cc-0.0.1.tar.gz"],
      integrity = "sha256-Tcy/0iwN7xZMj0dFi9UODHFI89kgAs20WcKpamhJgkE=",
      strip_prefix = "",
      remote_patches = {"https://bcr.bazel.build/modules/rules_cc/0.0.1/patches/add_module_extension.patch": "sha256-g3+zmGs0YT2HKOVevZpN0Jet89Ylw90Cp9XsIAY8QqU="},
      remote_patch_strip = 1,
    )
    # Rule http_archive defined at (most recent call last):
    #   /home/user/.cache/bazel/_bazel_user/6e893e0f5a92cc4cf5909a6e4b2770f9/external/bazel_tools/tools/build_defs/repo/http.bzl:355:31 in <toplevel>
    
    ## stardoc:
    # <builtin>
    http_archive(
      name = "stardoc~",
      urls = ["https://bcr.bazel.build/test-mirror/github.com/bazelbuild/stardoc/releases/download/0.5.0/stardoc-0.5.0.tar.gz", "https://github.com/bazelbuild/stardoc/releases/download/0.5.0/stardoc-0.5.0.tar.gz"],
      integrity = "sha256-yXlNzIAmow/2fPfPkeviRcopSyCwcYRdEsGSr+JDrXI=",
      strip_prefix = "",
      remote_patches = {},
      remote_patch_strip = 0,
    )
    # Rule http_archive defined at (most recent call last):
    #   /home/user/.cache/bazel/_bazel_user/6e893e0f5a92cc4cf5909a6e4b2770f9/external/bazel_tools/tools/build_defs/repo/http.bzl:355:31 in <toplevel>
    
  7. Xem những tiện ích mô-đun nào được sử dụng trong biểu đồ phần phụ thuộc.

    bazel mod graph --extension_info=usages --extension_filter=all
    
    <root> (my_project@1.0)
    ├───$@@rules_java.5.0.0//java:extensions.bzl%toolchains
    ├───rules_java@5.0.0 #
    │   ├───$@@rules_java.5.0.0//java:extensions.bzl%toolchains
    │   ├───rules_cc@0.0.1 #
    │   │   └───$@@rules_cc.0.0.1//bzlmod:extensions.bzl%cc_configure
    │   └───rules_proto@4.0.0
    │       └───rules_cc@0.0.1 ...
    └───stardoc@0.5.0
        └───rules_java@5.0.0 ...
    
  8. Xem những kho lưu trữ nào được tạo và nhập từ một số tiện ích cụ thể trong biểu đồ phần phụ thuộc.

    bazel mod show_extension @@rules_java~5.0.0//java:extensions.bzl%toolchains
    
    <root> (my_project@1.0)
    ├───$@@rules_java.5.0.0//java:extensions.bzl%toolchains
    │   ├───remotejdk17_linux
    │   ├╌╌remotejdk11_linux
    │   ├╌╌remotejdk11_linux_aarch64
    │   ├╌╌remotejdk11_linux_ppc64le
    │   ├╌╌remotejdk11_linux_s390x
    ...(some lines omitted)...
    ├───rules_java@5.0.0 #
    │   └───$@@rules_java.5.0.0//java:extensions.bzl%toolchains ...
    │       ├───local_jdk
    │       ├───remote_java_tools
    │       ├───remote_java_tools_darwin
    │       ├───remote_java_tools_linux
    │       ├───remote_java_tools_windows
    │       ├───remotejdk11_linux_aarch64_toolchain_config_repo
    │       ├───remotejdk11_linux_ppc64le_toolchain_config_repo
    ...(some lines omitted)...
    └───stardoc@0.5.0
        └───rules_java@5.0.0 ...
    
  9. Xem danh sách kho lưu trữ đã tạo của một tiện ích và cách sử dụng tiện ích đó trong mỗi mô-đun.

    bazel mod graph --extension_info=all --extension_filter=@rules_java//java:extensions.bzl%toolchains
    
    ## @@rules_java.5.0.0//java:extensions.bzl%toolchains:
    
    Fetched repositories:
      -   local_jdk (imported by bazel_tools@_, rules_java@5.0.0)
      -   remote_java_tools (imported by bazel_tools@_, rules_java@5.0.0)
      -   remote_java_tools_darwin (imported by bazel_tools@_, rules_java@5.0.0)
      -   remote_java_tools_linux (imported by bazel_tools@_, rules_java@5.0.0)
      -   remote_java_tools_windows (imported by bazel_tools@_, rules_java@5.0.0)
      -   remotejdk11_linux_aarch64_toolchain_config_repo (imported by rules_java@5.0.0)
      -   remotejdk11_linux_ppc64le_toolchain_config_repo (imported by rules_java@5.0.0)
    ...(some lines omitted)...
      -   remotejdk17_linux (imported by <root>)
      -   remotejdk11_linux
      -   remotejdk11_linux_aarch64
      -   remotejdk11_linux_ppc64le
      -   remotejdk11_linux_s390x
      -   remotejdk11_macos
    ...(some lines omitted)...
    
    # Usage in <root> at <root>/MODULE.bazel:14:27 with the specified attributes:
    use_repo(
      toolchains,
      my_jdk="remotejdk17_linux",
    )
    
    # Usage in bazel_tools@_ at bazel_tools@_/MODULE.bazel:23:32 with the specified attributes:
    use_repo(
      toolchains,
      "local_jdk",
      "remote_java_tools",
      "remote_java_tools_linux",
      "remote_java_tools_windows",
      "remote_java_tools_darwin",
    )
    
    # Usage in rules_java@5.0.0 at rules_java@5.0.0/MODULE.bazel:30:27 with the specified attributes:
    use_repo(
      toolchains,
      "remote_java_tools",
      "remote_java_tools_linux",
      "remote_java_tools_windows",
      "remote_java_tools_darwin",
      "local_jdk",
      "remotejdk11_linux_toolchain_config_repo",
      "remotejdk11_macos_toolchain_config_repo",
      "remotejdk11_macos_aarch64_toolchain_config_repo",
      ...(some lines omitted)...
    )
    
  10. Xem quy tắc cơ bản của một số kho lưu trữ tạo tiện ích.

    bazel mod show_repo --base_module=rules_java @remote_java_tools
    
    ## @remote_java_tools:
    # <builtin>
    http_archive(
      name = "rules_java~~toolchains~remote_java_tools",
      urls = ["https://mirror.bazel.build/bazel_java_tools/releases/java/v11.5/java_tools-v11.5.zip", "https://github.com/bazelbuild/java_tools/releases/download/java_v11.5/java_tools-v11.5.zip"],
      sha256 = "b763ee80e5754e593fd6d5be6d7343f905bc8b73d661d36d842b024ca11b6793",
    )
    # Rule http_archive defined at (most recent call last):
    #   /home/user/.cache/bazel/_bazel_user/6e893e0f5a92cc4cf5909a6e4b2770f9/external/bazel_tools/tools/build_defs/repo/http.bzl:355:31 in <toplevel>