cargo-tree(1)

定义

cargo-tree - 用树状结构展示依赖图

概要

cargo tree [options]

说明

这个命令在终端显示一个依赖关系树。 下面是一个依赖 "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" 种类可以改变输出结果,以显示每个依赖关系所启用的 feature。 例如 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 特性的 log , 而 log 又依赖于具有 "default" 特性的 cfg-if 。 当使用 -e feature 时,使用 -i 标志来帮助展示这些特性是如何进入包的。 请看下面的例子以了解更多细节。

特性统一

这个命令显示更接近 Cargo 构建的特性统一(feature-unified)的图形,而不是你在 Cargo.toml 中列出的。 例如,如果你在 [dependencies][dev-dependencies] 中都指定了相同的依赖关系,但却使用了不同的特性。 这个命令可能会合并所有特性,并在其中一个依赖项上显示一个 (*) 来表示重复的特性。

因此,要得到大概相同的对 cargo build 工作的预览,cargo tree -e normal,build 是相当接近的; 要得到大概相同的对 cargo test 工作的预览,cargo tree 是相当接近的。 然而,它并不能保证与 Cargo 要构建的内容完全等同,因为编译是复杂的,取决于很多不同的因素。

要了解更多关于特性统一(feature-unified)的信息,请查看专门的章节

选项

树选项

-i spec
--invert spec
显示指定软件包的反向依赖关系。这个标志将反转树,显示依赖给定包的包。

-p 标志可以用来显示软件包的反向依赖关系,只显示给 -p 的软件包的子树。

注意,在工作空间中,默认情况下,它只显示当前目录下工作空间成员的树中的包的反向依赖关系。 可以使用 --workspace 标志来扩展它,使其在整个工作空间显示软件包的反向依赖关系。

--prune spec
从依赖关系树的显示中删去给定的软件包。
--depth depth
依赖关系树的最大显示深度。例如,深度为1时,显示直接依赖关系。
--no-dedupe
不要删除重复的依赖关系。 通常情况下,当一个包已经显示了它的依赖关系,再次出现将不会重新显示它的依赖关系,并且会包括一个 (*) 来表示它已经被显示了。 这个标志令这些重复的内容显示出来。
-d
--duplicates
只显示有多个版本的依赖关系(意味着 --invert )。当与 -p 标志一起使用时,只显示指定软件包的子树中的重复内容。

这对构建时间和可执行文件的大小有好处,可以避免多次构建同一个软件包。 这个标志可以帮助识别冲突的软件包。然后,你可以查看包是否有相同的依赖但是依赖的版本不一, 将旧版本升级到新版本,这样就可以只构建一个实例。

-e kinds
--edges kinds
要显示的依赖的种类。接受一个逗号分隔的列表:

  • all — 展示所有最新的类型
  • normal — 展示正常依赖
  • build — 展示构建依赖
  • dev — 展示开发依赖
  • features — 显示每个依赖关系所启用的特性。如果这是唯一给出的种类,那么它将自动包括其他依赖关系的种类
  • no-normal — 不要包含正常依赖
  • no-build — 不要包含构建依赖
  • no-dev — 不要包含开发依赖
  • no-proc-macro — 不要包含程序宏依赖

normal, build, dev, and all 依赖种类不能与 no-normal, no-build, or no-dev 依赖种类混用。

默认是normal,build,dev

--target triple
过滤与目标三元组匹配的依赖。默认是宿主机平台。使用 all 来包括 所有 目标。

格式化树选项

--charset charset
选择树使用字符集. 有效的值为: "utf8" 或 "ascii"。 默认为 "utf8"。
-f format
--format format
设置每个包的格式字符串。默认是 "{p}"。

这是一个任意的字符串,它将被用来显示每个包。下列字符串将被替换成相应的值:

  • {p} — 包名
  • {l} — 包证书
  • {r} — 包的仓库地址
  • {f} — 逗号分割的包启用的特性列表
  • {lib} — 在 use 声明中使用的类库的名称
--prefix prefix
设置每行如何展示, 前缀 可以是下面的一种:

  • indent (默认) — 以树的格式缩进展示每一行
  • depth — 以列表形式显示,在每个条目前打印数字来展示深度
  • none — 以平铺的列表的形式展示

选择包

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

工作空间的默认成员可通过根清单中的 workspace.default-members 键明确设置。 如果没有设置,虚拟工作空间将包括所有工作空间成员(相当于传递 --workspace),而非虚拟工作空间将只包括根 crate 本身。

-p spec...
--package spec...
只展示指定的软件包。 关于SPEC的格式,见cargo-pkgid(1)。 这个标志可以指定多次,并支持常见的 Unix glob pattern,比如 *, ?[]。 然而,为了避免你的 shell 在 Cargo 处理 glob pattern 之前意外地扩展它们,你必须在每个 pattern 周围使用单引号或双引号。
--workspace
展示工作空间中的所有成员。
--exclude SPEC...
排除指定的包。 必须与--workspace标志一起使用。 这个标志可以被多次指定,并且支持常见的 Unix glob pattern,比如 *, ?[]。 然而,为了避免你的 shell 在 Cargo 处理 glob pattern 之前意外地扩展它们,你必须在每个 pattern 周围使用单引号或双引号。

清单选项

--manifest-path path
Cargo.toml 文件的路径. 默认情况下,Cargo 会在当前目录或任何父目录下搜索 Cargo.toml 文件。
--frozen
--locked
这两个标志都要求 Cargo.lock 文件是最新的。 如果 .lock 文件缺失,或者需要更新,Cargo 将以错误退出。 --frozen 标志也可以防止 Cargo 访问网络以确定其是否过期。

这些可以用于需要判断 Cargo.lock 文件是否最新(比如CI构建)或者想避免网络访问的环境中。

--offline
禁止 Cargo 在任何情况下访问网络。 如果没有这个标志,当 Cargo 需要访问网络而网络不可用时,它会以错误的方式停止。 有了这个标志,Cargo会尝试在没有网络的情况下进行。

请注意,这可能会导致与在线模式不同的依赖方案。Cargo 会将自己限制在本地的 crate 仓库上, 即使在本地拷贝的索引中可能有更新的版本也是如此。 参见 cargo-fetch(1) 命令来在离线前下载依赖关系。

也可以用 net.offline config value 来指定。

选择特性

feature 标志允许你控制启用哪些特性。当没有给出特性选项时,每个选定的包都会激活默认的功能。

更多的细节请参见the features documentation

-F features
--features features
要激活的 feature 用空格或逗号分隔的列表指定。工作空间成员的 feature 可以用 package-name/feature-name 的语法来启用。 这个标志可以被多次指定,这样可以启用所有指定的特性。
--all-features
激活所有选定包的所有可用 feature 。
--no-default-features
不激活所选包的 default 特性。

显示选项

-v
--verbose
使用 verbose 级别输出详细信息。 指定两次此选项来输出 "十分详细" 的输出信息, 这会包含额外的输出信息,比如依赖警告和构建脚本输出。 也可以与 term.verbose config value 一起使用。
-q
--quiet
不要打印任何 cargo 日志信息。 也可以与 term.quiet config value 一起使用。
--color when
控制的日志的颜色。有效的值如下:

  • auto (默认): 自动检测终端颜色支持是否可用。
  • always: 总是带颜色显示。
  • never: 不带颜色显示.

也可以与 term.color config value 一起使用。

通用选项

+toolchain
如果 Cargo 已经和 rustup 一起安装, 并且 cargo 的第一个参数以 + 开头, 它将被解释为一个 rustup 工具链的名字 (比如 +stable 或者 +nightly)。 更多关于工具链覆盖工作的信息,请参见 rustup documentation
--config KEY=VALUE or PATH
覆盖一个 Cargo 配置值。参数应该使用 TOML 的 KEY=VALUE 语法,或者提供一个额外配置文件的路径。 这个标志可以被多次指定。更多信息请参见 command-line overrides section
-h
--help
打印帮助信息。
-Z flag
Cargo 的不稳定 (仅限 nightly 版本) 标志。 更多信息请运行 cargo -Z help

环境

更多关于 Cargo 读取的环境变量信息,请参见the reference

退出状态

  • 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 特性都是由 "默认" 功能添加的("quote" 是由 "printing" 和 "proc-macro" 添加的,它们都是默认特性)。

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

另请参见

cargo(1), cargo-metadata(1)