第59章 Cargo Install 命令详解
名称
cargo-install — 构建并安装 Rust 二进制程序
概要
cargo install [选项] crate[@版本]…cargo install [选项] --path 路径cargo install [选项] --git url [crate…]cargo install [选项] --list
描述
此命令管理 Cargo 本地安装的二进制 crate。只有包含可执行的 [[bin]] 或 [[example]] 目标的包才能被安装,所有可执行文件都会安装到安装根目录的 bin 文件夹下。默认只安装二进制文件,不安装示例。
安装根目录按以下优先级确定:
--root选项CARGO_INSTALL_ROOT环境变量- Cargo 的 配置项
install.root CARGO_HOME环境变量$HOME/.cargo
crate 可以从多个来源安装,默认来源是 crates.io,但可以通过 --git、--path 和 --registry 标志更改来源。如果来源包含多个包(比如 crates.io,或包含多个 crate 的 git 仓库),则必须通过 crate 参数指明要安装哪个 crate。
从 crates.io 安装时,可以用 --version 标志指定要安装的版本;从 git 仓库安装时,同样可以指定要安装的分支、标签或修订版本。如果 crate 包含多个二进制文件,可以用 --bin 参数选择只安装其中一个;如果想安装示例,则可以使用 --example 参数。
如果包已经安装,当已安装的版本看起来不是最新时,Cargo 会重新安装。只要下列任意一项发生变化,Cargo 就会重新安装该包:
- 包的版本和来源。
- 所安装的二进制文件名集合。
- 所选的 features。
- profile(
--profile)。 - 目标平台(
--target)。
使用 --path 安装时,Cargo 始终会构建并安装包,除非存在来自其他包的冲突二进制文件。可以使用 --force 标志强制 Cargo 始终重新安装包。
如果源码来自 crates.io 或 --git,默认情况下 crate 会在临时 target 目录中构建。若要避免此行为,可将 CARGO_TARGET_DIR 环境变量设为指定路径以设定 target 目录。在持续集成系统中,利用此特性缓存构建产物尤其有用。
处理锁文件
默认情况下,包附带的 Cargo.lock 文件会被忽略。这意味着 Cargo 会重新计算依赖版本,可能会使用包发布后新发布的更新版本。--locked 标志可强制 Cargo 使用打包的 Cargo.lock 文件(如果可用)。这在确保可复现构建时非常有用,可以确保使用包发布时相同的依赖集。如果依赖的新版本不再支持您的系统或存在其他问题,该标志也很有用。使用 --locked 的缺点是,您将无法获得任何依赖项的修复或更新。请注意,Cargo 从 1.37 版本才开始发布 Cargo.lock 文件,这意味着在此之前的版本发布的包没有可用的 Cargo.lock 文件。
配置发现
此命令在系统或用户级别运行,而非项目级别。这意味着会忽略本地的配置发现机制。相反,配置发现将从 $CARGO_HOME/config.toml 开始。如果通过 --path $PATH 安装包,则使用本地配置,发现过程从 $PATH/.cargo/config.toml 开始。
选项
安装选项
--versversion--versionversion-
指定要安装的版本。这可以是一个版本约束(例如
~1.2),Cargo 会根据该约束选择最新的版本。如果版本字符串中没有约束运算符(如^或~),则必须遵循 MAJOR.MINOR.PATCH 格式,并精确安装该版本;它不像 Cargo 依赖项那样被解析为“^”(caret)约束。 --giturl-
指定要从中安装指定 crate 的 Git 仓库 URL。
--branchbranch-
从 Git 仓库安装时使用的分支。
--tagtag-
从 Git 仓库安装时使用的标签(Tag)。
--revsha-
从 Git 仓库安装时使用的特定提交(Commit)。
--pathpath-
本地 crate 的文件系统路径,用于从中安装。
--list-
列出所有已安装的包及其版本。
-n--dry-run-
(不稳定)执行所有检查,但不实际安装。
-f--force-
强制覆盖已存在的 crate 或二进制文件。当某个包安装的二进制文件与其他包重名时,可以用这个选项。此外,如果系统环境发生了变化(比如升级到了新版本的
rustc),想重新构建时也可以用它。 --no-track-
默认情况下,Cargo 会在安装根目录下用一个元数据文件来跟踪已安装的包。此选项让 Cargo 不使用也不创建该文件。启用后,除非使用
--force,否则 Cargo 会拒绝覆盖任何已存在的文件。这同时也会禁用 Cargo 防止多个 Cargo 进程并发安装的保护机制。 --binname…-
只安装指定的二进制文件。
--bins-
安装所有二进制文件,这也是默认行为。
--examplename…-
只安装指定的示例。
--examples-
安装所有示例。
--rootdir-
安装包的目标目录。
--registryregistry-
使用的注册表名称。注册表名称在 Cargo 配置文件中定义。如果未指定,则使用默认注册表,该注册表由
registry.default配置项定义,其默认值为crates-io。 --indexindex-
使用的注册表索引 URL。
特性选择
特性标志允许你控制启用的特性。在未给出任何特性选项时,会为每个选定的包激活 default 特性。
更多详情请参见 特性文档。
-Ffeatures--featuresfeatures-
要激活的特性列表,以空格或逗号分隔。可以使用
package-name/feature-name语法启用工作区成员的特性。此标志可以多次指定,从而激活所有指定的特性。 --all-features-
激活所有选定包的全部可用特性。
--no-default-features-
不激活所选软件包的
defaultfeature。
编译选项
--targettriple-
为指定的目标架构安装。默认使用宿主架构。triple 的通用格式为
<arch><sub>-<vendor>-<sys>-<abi>。可能的取值:
rustc --print target-list中列出的任何受支持的目标。"host-tuple",该值会在内部被替换为宿主机的目标。这在交叉编译某些 crates 且不想将宿主机指定为目标时特别有用(例如,在由多个宿主机共同开发的共享项目中,xtask可能用于不同环境)。- 自定义目标规范的路径。更多信息请参阅 Custom Target Lookup Path。
也可以通过
build.target配置值 进行指定。请注意,指定此标志会使 Cargo 进入不同的运行模式,目标制品将被放置在单独的目录中。更多细节请参阅 build cache 文档。
--target-dirdirectory-
用于存放所有生成的制品和中间文件的目录。也可以通过环境变量
CARGO_TARGET_DIR或build.target-dir配置值 进行指定。 默认为平台临时目录中新建的临时文件夹。使用
--path时,除非指定了--target-dir,否则默认使用本地 crate 工作区中的target目录。 --debug-
使用
devprofile 而非releaseprofile 进行构建。 如需按名称指定特定 profile,请参见--profile选项。 --profilename-
使用指定的 profile 进行安装。 关于 profile 的更多细节,参见参考文档。
--timings-
输出每次编译的耗时信息,并跟踪并发情况随时间的变化。
构建结束后会在
target/cargo-timings目录下生成一个cargo-timing.html文件。如果想查看之前的构建,还会额外生成一份文件名带时间戳的报告。这些报告仅供人工查阅,不提供机器可读的计时数据。
清单选项
--ignore-rust-version-
忽略包中的
rust-version声明。 --locked-
要求使用与现有
Cargo.lock文件生成时完全相同的依赖及版本。出现以下任一情况时,Cargo 会报错退出:- lock 文件不存在。
- 由于依赖解析结果不同,Cargo 试图修改 lock 文件。
该选项适用于需要确定性构建的环境,例如 CI 流水线。
--offline-
阻止 Cargo 出于任何原因访问网络。未使用此标志时,若需访问网络但网络不可用,Cargo 将报错并停止。使用该标志后,若条件允许,Cargo 会尝试在无网络状态下继续执行。
注意,这可能导致与在线模式不同的依赖解析结果。Cargo 会限制仅使用本地已下载的 crate,即使本地索引副本中显示可能存在更新版本。建议在进入离线模式前,使用 cargo-fetch(1) 命令预先下载依赖。
也可通过
net.offline配置项进行指定。 --frozen-
相当于同时指定
--locked和--offline。
其他选项
-jN--jobsN-
并行任务的运行数量。也可通过
build.jobs配置项进行指定。默认值为逻辑 CPU 数量。若为负数,则最大并行任务数设置为逻辑 CPU 数量加上该负数的绝对值。若提供字符串default,则恢复默认值。不应为 0。 --keep-going-
尽可能构建依赖图中的所有 crate,而不是在遇到第一个构建失败时立即终止构建。
例如,若当前包依赖
fails和works两个库,其中某一个编译失败,cargo install -j1未必会构建那个成功的库(取决于 Cargo 先执行了两个库中的哪一个),而cargo install -j1 --keep-going则一定会尝试构建两者,即使先执行的那个失败了。
显示选项
-v--verbose-
使用详细输出。可指定两次以获得“极详细”输出,包含依赖项警告和构建脚本输出等额外信息。也可通过
term.verbose配置项 指定。 -q--quiet-
不打印 Cargo 日志信息。也可通过
term.quiet配置项 指定。 --colorwhen-
控制何时使用彩色输出。有效值如下:
auto(默认):自动检测终端是否支持颜色。always:始终显示颜色。never:从不显示颜色。
也可通过
term.color配置项 指定。 --message-formatfmt-
诊断信息的输出格式。可多次指定,由逗号分隔的值组成。有效值如下:
human(默认):以人类可读的文本格式输出。不能与short和json同时使用。short:输出更简短的人类可读文本信息。不能与human和json同时使用。json:向 stdout 输出 JSON 消息。详见参考文档。不能与human和short同时使用。json-diagnostic-short:确保 JSON 消息的rendered字段使用 rustc 的“short”渲染格式。不能与human或short同时使用。json-diagnostic-rendered-ansi:确保 JSON 消息的rendered字段内嵌 ANSI 颜色代码,以符合 rustc 的默认配色方案。不能与human或short同时使用。json-render-diagnostics:让 Cargo 不在输出的 JSON 消息中包含 rustc 的诊断信息,而是由 Cargo 自己渲染来自 rustc 的 JSON 诊断。Cargo 自身的 JSON 诊断以及来自 rustc 的其他诊断信息仍会正常输出。不能与human或short同时使用。
通用选项
+toolchain-
如果 Cargo 是通过 rustup 安装的,且
cargo的第一个参数以+开头,它会被解析为 rustup 的工具链名称(例如+stable或+nightly)。 关于工具链覆盖机制的更多信息,请参阅 rustup 文档。 --configKEY=VALUE 或 PATH-
覆盖 Cargo 的配置项。参数可以是
KEY=VALUE形式的 TOML 语法,也可以是一个额外配置文件的路径。此参数可多次指定。 更多信息请参阅命令行覆盖一节。 -CPATH-
在执行指定操作之前更改当前工作目录。这会影响诸如 cargo 默认查找项目清单文件(
Cargo.toml)的位置,以及搜索.cargo/config.toml的目录等。此选项必须位于命令名称之前,例如cargo -C path/to/my-project build。此选项仅在 nightly channel 上可用, 并且需要启用
-Z unstable-options标志(参见 #10098)。 -h--help-
打印帮助信息。
-Zflag-
Cargo 的不稳定标志(仅限 nightly)。运行
cargo -Z help查看详细信息。
ENVIRONMENT
有关 Cargo 读取的环境变量详情,请参见参考文档。
EXIT STATUS
0:Cargo 成功。101:Cargo 未能完成。
EXAMPLES
-
从 crates.io 安装或升级软件包:
cargo install ripgrep -
安装或重新安装当前目录中的软件包:
cargo install --path . -
查看已安装软件包的列表:
cargo install --list
SEE ALSO
cargo(1), cargo-uninstall(1), cargo-search(1), cargo-publish(1)