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
, andall
依赖种类不能与no-normal
,no-build
, orno-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 错误退出.
示例
-
显示当前目录下的包的树:
cargo tree
-
显示所有依赖
syn
的包:cargo tree -i syn
-
显示每个软件包上启用的特性:
cargo tree --format "{p} {f}"
-
显示所有被多次构建的包。如果树上出现多个 semver 不兼容的版本(比如 1.0.0 和 2.0.0),就会出现这种情况
cargo tree -d
-
解释为什么会启用
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
标志来获得完整的输出。