cargo-tree(1)

名称

cargo-tree — 显示依赖关系图的树状可视化

概要

cargo tree [选项]

描述

此命令将在终端中显示依赖关系树。 一个简单的项目依赖于 “rand” 包的示例

myproject v0.1.0 (/myproject) └── rand v0.7.3 ├── getrandom v0.1.14 │ ├── cfg-if v0.1.10 │ └── libc v0.2.68 ├── libc v0.2.68 (*) ├── rand_chacha v0.2.2 │ ├── ppv-lite86 v0.2.6 │ └── rand_core v0.5.1 │ └── getrandom v0.1.14 (*) └── rand_core v0.5.1 (*) [build-dependencies] └── cc v1.0.50

标记为 (*) 的包已“去重”。 该包的依赖项已在图中的其他位置显示,因此不再重复显示。 使用 --no-dedupe 选项可重复显示重复项。

-e 标志可用于选择要显示的依赖类型。“features” 类型会更改输出,以显示每个依赖项启用的功能。 例如,cargo tree -e features

myproject v0.1.0 (/myproject) └── log feature "serde" └── log v0.4.8 ├── serde v1.0.106 └── cfg-if feature "default" └── cfg-if v0.1.10

在此树中,myproject 依赖于具有 serde 功能的 loglog 反过来依赖于具有 “default” 功能的 cfg-if。 当使用 -e features 时,使用 -i 标志来显示功能如何流入包中会很有帮助。 有关更多详细信息,请参见下面的示例。

功能统一

此命令显示的图更接近 Cargo 将构建的功能统一图,而不是您在 Cargo.toml 中列出的内容。 例如,如果您在 [dependencies][dev-dependencies] 中指定相同的依赖项,但启用了不同的功能。 此命令可能会合并所有功能,并在其中一个依赖项上显示 (*) 以指示重复项。

因此,对于 cargo build 功能的几乎等效的概述,cargo tree -e normal,build 非常接近; 对于 cargo test 功能的几乎等效的概述,cargo tree 非常接近。 但是,它不能保证与 Cargo 将要构建的内容完全等效,因为编译很复杂,并且取决于许多不同的因素。

要了解有关功能统一的更多信息,请查看此专用章节

选项

树选项

-i spec
--invert spec
显示给定包的反向依赖项。 此标志将反转树并显示依赖于给定包的包。

请注意,在工作区中,默认情况下,它只会显示当前目录中工作区成员树内的包的反向依赖项。 可以使用 --workspace 标志来扩展它,以便它将显示整个工作区中包的反向依赖项。 -p 标志可用于仅显示给定给 -p 的包子树中的包的反向依赖项。

--prune spec
从依赖关系树的显示中修剪给定的包。
--depth depth
依赖关系树的最大显示深度。 例如,深度为 1 会显示直接依赖项。

如果给定的值是 workspace,则仅显示作为当前工作区成员的依赖项。

--no-dedupe
不要去重重复的依赖项。 通常,当一个包已经显示其依赖项时,后续出现的情况将不再重新显示其依赖项,并且将包含一个 (*) 以指示它已被显示。 此标志将导致重复项被重复显示。
-d
--duplicates
仅显示以多个版本出现的依赖项(暗示 --invert)。 当与 -p 标志一起使用时,仅显示给定包的子树中的重复项。

避免多次构建同一个包对于构建时间和可执行文件大小可能是有益的。 此标志可以帮助识别有问题的包。 然后,您可以调查依赖于旧版本的重复项的包是否可以更新到较新版本,以便只构建一个实例。

-e kinds
--edges kinds
要显示的依赖类型。 接受逗号分隔的值列表

  • all — 显示所有边类型。
  • normal — 显示正常依赖项。
  • build — 显示构建依赖项。
  • dev — 显示开发依赖项。
  • features — 显示每个依赖项启用的功能。 如果这是唯一给定的类型,则它将自动包含其他依赖类型。
  • no-normal — 不包括正常依赖项。
  • no-build — 不包括构建依赖项。
  • no-dev — 不包括开发依赖项。
  • no-proc-macro — 不包括过程宏依赖项。

normalbuilddevall 依赖类型不能与 no-normalno-buildno-dev 依赖类型混合使用。

默认值为 normal,build,dev

--target triple
筛选与给定的 目标三元组 匹配的依赖项。 默认值为宿主平台。 使用值 all 以包含所有目标。

树格式化选项

--charset charset
选择用于树的字符集。 有效值为 “utf8” 或 “ascii”。 如果未指定,cargo 将自动选择一个值。
-f format
--format format
设置每个包的格式字符串。 默认值为 “{p}”。

这是一个任意字符串,将用于显示每个包。 以下字符串将被替换为相应的值

  • {p} — 包名称。
  • {l} — 包许可证。
  • {r} — 包仓库 URL。
  • {f} — 逗号分隔的已启用包功能列表。
  • {lib} — 包库的名称,如 use 语句中所用。
--prefix prefix
设置每行的显示方式。 prefix 值可以是以下之一

  • indent (默认) — 以树状缩进显示每行。
  • depth — 以列表形式显示,并在每个条目之前打印数字深度。
  • none — 以平面列表形式显示。

包选择

默认情况下,当没有给出包选择选项时,选择的包取决于所选的清单文件(如果未给出 --manifest-path,则基于当前工作目录)。 如果清单是工作区的根目录,则选择工作区的默认成员,否则仅选择由清单定义的包。

工作区的默认成员可以使用根清单中的 workspace.default-members 键显式设置。 如果未设置,虚拟工作区将包括所有工作区成员(等效于传递 --workspace),而非虚拟工作区将仅包括根 crate 本身。

-p spec
--package spec
仅显示指定的包。 有关 SPEC 格式,请参见 cargo-pkgid(1)。 此标志可以多次指定,并支持常见的 Unix glob 模式,如 *?[]。 但是,为了避免您的 shell 在 Cargo 处理 glob 模式之前意外地展开它们,您必须在每个模式周围使用单引号或双引号。
--workspace
显示工作区中的所有成员。
--exclude SPEC
排除指定的包。 必须与 --workspace 标志结合使用。 此标志可以多次指定,并支持常见的 Unix glob 模式,如 *?[]。 但是,为了避免您的 shell 在 Cargo 处理 glob 模式之前意外地展开它们,您必须在每个模式周围使用单引号或双引号。

清单选项

--manifest-path path
Cargo.toml 文件的路径。 默认情况下,Cargo 在当前目录或任何父目录中搜索 Cargo.toml 文件。
--locked
断言使用的依赖项和版本与最初生成现有 Cargo.lock 文件时使用的完全相同。 当出现以下任一情况时,Cargo 将退出并显示错误

  • 缺少 lock 文件。
  • 由于不同的依赖项解析,Cargo 尝试更改 lock 文件。

它可以在需要确定性构建的环境中使用,例如在 CI 管道中。

--offline
阻止 Cargo 出于任何原因访问网络。 如果没有此标志,则当 Cargo 需要访问网络且网络不可用时,Cargo 将停止并显示错误。 使用此标志,如果可能,Cargo 将尝试在没有网络的情况下继续。

请注意,这可能会导致与在线模式不同的依赖项解析。 Cargo 将自身限制为本地下载的 crates,即使索引的本地副本中可能指示有更新的版本。 有关在离线之前下载依赖项的信息,请参见 cargo-fetch(1) 命令。

也可以使用 net.offline config 值 指定。

--frozen
等效于同时指定 --locked--offline
--lockfile-path PATH
将 lockfile 的路径从默认路径 (<workspace_root>/Cargo.lock) 更改为 PATHPATH 必须以 Cargo.lock 结尾 (例如 --lockfile-path /tmp/temporary-lockfile/Cargo.lock)。 请注意,提供 --lockfile-path 将忽略默认路径下的现有 lockfile,而是使用 PATH 中的 lockfile,或者如果提供的 PATH 中不存在 lockfile,则在其中写入新的 lockfile。 此标志可用于在只读目录中运行大多数命令,并将 lockfile 写入提供的 PATH 中。

此选项仅在 nightly channel 上可用,并且需要 -Z unstable-options 标志才能启用(请参见 #14421)。

功能选择

功能标志允许您控制启用哪些功能。 当未给出功能选项时,将为每个选定的包激活 default 功能。

有关更多详细信息,请参见 功能文档

-F features
--features features
要激活的功能的空格或逗号分隔列表。 工作区成员的功能可以使用 package-name/feature-name 语法启用。 此标志可以多次指定,这将启用所有指定的功能。
--all-features
激活所有选定包的所有可用功能。
--no-default-features
不要激活选定包的 default 功能。

显示选项

-v
--verbose
使用详细输出。 可以指定两次以获得“非常详细”的输出,其中包括额外的输出,例如依赖项警告和构建脚本输出。 也可以使用 term.verbose config 值 指定。
-q
--quiet
不要打印 cargo 日志消息。 也可以使用 term.quiet config 值 指定。
--color when
控制何时使用彩色输出。 有效值

  • auto (默认): 自动检测终端上是否提供颜色支持。
  • always: 始终显示颜色。
  • never: 永不显示颜色。

也可以使用 term.color config 值 指定。

常用选项

+toolchain
如果 Cargo 已使用 rustup 安装,并且 cargo 的第一个参数以 + 开头,则它将被解释为 rustup 工具链名称(例如 +stable+nightly)。 有关工具链覆盖如何工作的更多信息,请参见 rustup 文档
--config KEY=VALUE or PATH
覆盖 Cargo 配置值。 参数应采用 KEY=VALUE 的 TOML 语法,或作为额外配置文件的路径提供。 此标志可以多次指定。 有关更多信息,请参见 命令行覆盖部分
-C PATH
在执行任何指定操作之前更改当前工作目录。 这会影响 cargo 默认查找项目清单 (Cargo.toml) 的位置,以及搜索以发现 .cargo/config.toml 的目录,例如。 此选项必须出现在命令名称之前,例如 cargo -C path/to/my-project build

此选项仅在 nightly channel 上可用,并且需要 -Z unstable-options 标志才能启用(请参见 #10098)。

-h
--help
打印帮助信息。
-Z flag
Cargo 的不稳定(仅限 nightly)标志。 运行 cargo -Z help 以获取详细信息。

环境变量

有关 Cargo 读取的环境变量的详细信息,请参见 参考

退出状态

  • 0: Cargo 成功。
  • 101: Cargo 未能完成。

示例

  1. 显示当前目录中包的树

    cargo tree
  2. 显示所有依赖于 syn 包的包

    cargo tree -i syn
  3. 显示每个包上启用的功能

    cargo tree --format "{p} {f}"
  4. 显示所有多次构建的包。 如果树中出现多个 semver 不兼容的版本(例如 1.0.0 和 2.0.0),则可能会发生这种情况。

    cargo tree -d
  5. 解释为什么为 syn 包启用了功能

    cargo tree -e features -i syn

    -e features 标志用于显示功能。 -i 标志用于反转图,以便显示依赖于 syn 的包。 这将显示的一个示例

    syn v1.0.17 ├── syn feature "clone-impls" │ └── syn feature "default" │ └── rustversion v1.0.2 │ └── rustversion feature "default" │ └── myproject v0.1.0 (/myproject) │ └── myproject feature "default" (command-line) ├── syn feature "default" (*) ├── syn feature "derive" │ └── syn feature "default" (*) ├── syn feature "full" │ └── rustversion v1.0.2 (*) ├── syn feature "parsing" │ └── syn feature "default" (*) ├── syn feature "printing" │ └── syn feature "default" (*) ├── syn feature "proc-macro" │ └── syn feature "default" (*) └── syn feature "quote" ├── syn feature "printing" (*) └── syn feature "proc-macro" (*)

    要读取此图,您可以跟踪从根到每个功能的链,以查看为什么包含它。 例如,“full” 功能由 rustversion crate 添加,该 crate 从 myproject(使用默认功能)包含,而 myproject 是在命令行上选择的包。 所有其他 syn 功能都由 “default” 功能添加(“quote” 由 “printing” 和 “proc-macro” 添加,这两者都是默认功能)。

    如果您在交叉引用去重的 (*) 条目时遇到困难,请尝试使用 --no-dedupe 标志以获取完整输出。

另请参阅

cargo(1), cargo-metadata(1)