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 又依赖于具有“默认”功能的 cfg-if。 使用 -e features 时,使用 -i 标志来显示功能如何流入包可能会有所帮助。 有关更多详细信息,请参见下面的示例。

功能统一

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

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

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

选项

树选项

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

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

--prune 规范
从依赖树的显示中修剪给定的包。
--depth 深度
依赖树的最大显示深度。 例如,深度为 1 将显示直接依赖项。
--no-dedupe
不要去重重复的依赖项。 通常,当一个包已经显示了它的依赖项时,进一步的出现将不会重新显示它的依赖项,并且将包含一个 (*) 来指示它已经被显示过。 此标志将导致重复那些重复项。
-d
--duplicates
仅显示具有多个版本的依赖项(隐含 --invert)。 与 -p 标志一起使用时,仅显示给定包的子树中的重复项。

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

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

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

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

默认值为 normal,build,dev

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

树形格式选项

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

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

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

  • indent(默认值)- 将每行缩进显示为树形结构。
  • depth - 显示为列表,并在每个条目之前打印数字深度。
  • none - 显示为平面列表。

包选择

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

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

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

清单选项

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

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

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

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

请注意,这可能会导致与在线模式不同的依赖项解析。Cargo 将限制自己使用本地下载的 crate,即使本地索引副本中指示可能有更新的版本。请参阅 cargo-fetch(1) 命令以下载依赖项,然后再脱机。

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

--frozen
等效于同时指定 --locked--offline

功能选择

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

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

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

显示选项

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

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

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

常用选项

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

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

-h
--help
打印帮助信息。
-Z 标志
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. 显示所有多次构建的包。如果树中出现多个语义版本不兼容的版本(如 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)