Bazel 6.3.0 中引入的 mod 命令提供了一系列工具,可帮助
用户在启用 Bzlmod 时了解其外部依赖关系图。借助该命令,您可以直观呈现依赖关系图,了解图中为何存在特定模块或模块
版本,查看支持模块的仓库定义,检查模块扩展程序的使用情况及其生成的仓库,以及使用其他功能。
语法
bazel mod <subcommand> [<options>] [<arg> [<arg>...]]
以下是可用的子命令及其各自的必需实参:
graph:显示项目的完整依赖关系图,从 根模块开始。如果在--from中指定了一个或多个模块,这些 模块将直接显示在根模块下,并且图仅从这些模块开始展开(请参阅示例)。deps <arg>...:与graph类似,显示每个 指定模块的已解析直接依赖项。all_paths <arg>...:显示从根模块到 指定<arg>...的所有现有路径。如果在--from中指定了一个或多个模块, 这些模块将直接显示在根模块下,并且图包含从--from模块到实参模块的任何现有路径(请参阅 示例)。path <arg>...:具有与all_paths相同的语义,但仅显示从某个--from模块到某个实参模块的单个路径。explain <arg>...:显示指定模块在依赖关系图中出现的所有位置 ,以及直接依赖于 这些模块的模块。`explain` 命令的输出本质上是 `all_paths` 命令的精简版本,包含 1) 根模块;2) 根模块的 直接依赖项,这些依赖项指向实参模块;3) 实参 模块的直接依赖项;以及 4) 实参模块本身(请参阅示例)。show_repo <arg>...:显示指定仓库的定义(请参阅 示例)。show_extension <extension>...:显示有关每个指定扩展程序的信息:生成的仓库列表以及使用use_repo导入这些仓库的模块,以及每个使用该扩展程序的模块中该扩展程序的使用情况列表,其中包含指定的标记和use_repo调用(请参阅示例)。
<arg> 是指一个或多个模块或仓库。它可以是以下项之一:
字面量字符串
<root>:表示当前项目的根模块 。<name>@<version>:版本为<version>的模块<name>。对于具有非注册表替换的模块 ,请使用下划线 (_) 作为<version>。<name>:模块<name>的所有当前版本。@<repo_name>:在--base_module的上下文中具有给定 显示 名称 的仓库。@@<repo_name>:具有给定规范 名称的仓库。
在需要指定模块的上下文中,也可以使用引用与模块对应的仓库(而不是扩展程序生成的仓库)的 <arg>。相反,在需要指定仓库的上下文中,引用
模块的 <arg> 可以代替相应的仓库。
<extension> 的格式必须为 <arg><label_to_bzl_file>%<extension_name>。
<label_to_bzl_file> 部分必须是仓库相对标签(例如
//pkg/path:file.bzl)。
以下选项仅影响输出图的子命令(graph、
deps、all_paths、path 和 explain):
--from <arg>[,<arg>[,...]]默认值:<root>:在graph、all_paths、path和explain中展开图的模块。如需了解详情,请查看子命令的说明。--verbose默认值:"false":在输出图中包含有关每个模块的版本解析的额外 信息。如果模块 版本在解析期间发生了更改,请显示替换它的版本或 原始版本、替换原因,以及如果原因是 最低版本 选择,则显示请求新版本的模块。--include_unused默认值:"false":在输出图中包含 最初存在于依赖关系图中但在模块解析后未使用的 模块。--extension_info <mode>:在输出图中包含有关模块扩展程序 使用情况的信息(请参阅示例)。<mode>可以是以下项之一:hidden(默认):不显示有关扩展程序的任何信息。usages:在每个使用扩展程序的模块下显示扩展程序。它们 以$<extension>的形式输出。repos:除了usages之外,还在每个扩展程序使用情况下方显示使用use_repo导入的仓库。all:除了usages和repos之外,还显示 未被任何模块导入的扩展程序生成的仓库。这些 额外的仓库显示在输出中生成 扩展程序的首次出现位置下方,并以虚线边连接。
--extension_filter <extension>[,<extension>[,...]]:如果指定, 输出图仅包含使用指定扩展程序的模块,以及 指向这些模块的路径。指定空扩展程序列表(如--extension_filter=)等同于指定依赖关系图中任何模块使用的所有扩展程序。--depth <N>:输出图的深度。深度为 1 时,仅显示 根模块及其直接依赖项。`explain` 的默认值为 1,`deps` 的默认值为 2,其他子命令的默认值为无限。--cycles默认值:false:在输出图中包含循环边。--include_builtin默认值:"false":在输出图中包含内置模块(例如@bazel_tools)。此标志默认处于停用状态,因为 每个其他模块都隐式依赖于内置模块,这 会使输出非常混乱。--charset <charset>默认值:utf8:指定用于文本 输出的字符集。有效值为"utf8"和"ascii"。唯一显著的 区别在于用于以"text"输出格式绘制图的特殊字符,这些字符在"ascii"字符集中不存在。 因此,存在"ascii"字符集也是为了支持无法使用 Unicode 的 旧版平台。--output <mode>:在输出图中包含有关模块扩展程序使用情况的信息,作为 输出图的一部分。<mode> 可以是以下项之一:text(默认):输出图的人类可读表示形式 (展平为树)。json:以 JSON 对象的形式输出图(展平为 树)。graph:以 Graphviz dot 表示形式输出图。
bazel mod graph --output graph | dot -Tsvg > /tmp/graph.svg
其他选项包括:
--base_module <arg>默认值:<root>:指定一个模块,实参中的显示仓库名称将相对于 该模块进行解读。请注意,此 实参本身可以采用@<repo_name>的形式;系统始终 相对于根模块解读此实参。--extension_usages <arg>[,<arg>[,...]]:过滤show_extension以仅 显示指定模块的扩展程序使用情况。
示例
下面展示了在实际 Bazel 项目中使用 mod 命令的一些可能用法,以便您大致了解如何使用该命令检查项目的
外部依赖项。
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")
|
|
|
显示项目的整个依赖关系图。
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 ......显示整个依赖关系图(包括 未使用的模块,以及有关版本解析的额外信息)。
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)显示从 某些特定模块展开的依赖关系图。
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 ...显示两个 模块之间的所有路径。
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 ...了解项目依赖于某些 模块的原因和方式。
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 ...了解某些模块仓库的基础规则。
bazel mod show_repo rules_cc stardoc## rules_cc@0.0.1: # <builtin> http_archive( name = "rules_cc~0.0.1", 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~0.5.0", 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>了解依赖关系图 中使用的模块扩展程序。
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 ...了解作为依赖关系图的一部分,从某些特定扩展程序生成和 导入的仓库。
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 ...了解扩展程序生成的仓库列表,以及该扩展程序在每个模块中的使用方式。
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)... )了解某些 扩展程序生成的仓库的基础规则。
bazel mod show_repo --base_module=rules_java @remote_java_tools## @remote_java_tools: # <builtin> http_archive( name = "rules_java~5.0.0~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>