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>
:模块<name>
,版本为<version>
。对于模块 如果设置了非注册表覆盖,请使用下划线 (_
) 作为<version>
。<name>
:模块<name>
的所有现有版本。@<repo_name>
:具有给定表项的代码库 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
default: "false":包含在输出图 extra 中 有关每个模块版本分辨率的信息。如果模块 解决期间更改的版本,显示替换了该版本或 原始版本是什么、被替换的原因以及哪些模块 如果原因是最低版本,则请求新版本 选择。--include_unused
default: "false":将 这些模块最初出现在依赖关系图中,但后来变成了 模块解析后不使用。--extension_info <mode>
:包含有关模块扩展的信息 使用情况作为输出图的一部分(请参阅示例)。<mode>
可以是以下其中一项:hidden
(默认):不显示与扩展程序有关的任何内容。usages
:在使用扩展程序的每个模块下显示扩展程序。他们 以$<extension>
的形式输出。repos
:除了usages
之外,还会显示使用use_repo
。all
:除了usages
和repos
之外,还会显示 未由任何模块导入的扩展程序生成的代码库。这些 额外的代码库显示在 扩展,并通过虚线连接起来。
--extension_filter <extension>[,<extension>[,...]]
:如果指定,则 输出图仅包含使用指定扩展的模块,以及 通向这些模块的路径。指定空的扩展程序列表(如 )等同于指定所使用的所有扩展名--extension_filter=
由依赖关系图中的任何模块定义。--depth <N>
:输出图的深度。深度为 1 时, root 及其直接依赖项。explain
的默认值为 1,deps
的默认值为 2 而对于其他数据,则数据量为无穷大。--cycles
default: "false":在输出图中包含周期边缘。--include_builtin
default: "false":包含内置模块(例如@bazel_tools
)。该标记默认处于停用状态,因为 其他内置模块均隐式依赖这些内置模块, 会严重导致输出杂乱--charset <charset>
默认值:utf8:指定用于文本的字符集 输出。有效值为"utf8"
和"ascii"
。唯一重要的 区别在于用于绘制图表的"text"
输出格式,该格式在"ascii"
字符集中不存在。 因此,"ascii"
字符集的存在也支持在 不支持使用 Unicode 的旧版平台。--output <mode>
:包含有关模块扩展用法的信息,例如 部分输出图。<mode
>可以是以下其中一项:text
(默认):以人类可读的方式表示输出图 (扁平化为树状结构)。json
:以 JSON 对象的形式输出图表(扁平化为 树)。graph
:以 Graphviz 点表示形式输出图表。
bazel mod graph --output graph | dot -Tsvg > /tmp/graph.svg
其他选项包括:
--base_module <arg>
默认值:<root>
:指定相对于 系统会解释参数中明显的代码库名称。请注意, 参数本身可采用@<repo_name>
形式;始终 相对于根模块的解释--extension_usages <arg>[,<arg>[,...]]
:过滤“show_extension
”到“仅限” 显示指定模块中的扩展程序使用情况。
示例
我们展示 mod
命令在真实 Bazel 项目上的一些可能用法
下面将为您大致介绍一下如何使用该工具检查项目的
外部依赖项
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")
<ph type="x-smartling-placeholder"> |
<ph type="x-smartling-placeholder"> |
显示应用的整个依赖关系图 项目。
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)... )
查看某些 API 的基本规则 扩展程序生成的代码库
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>