入门 The Cargo Team 2026-09-13 15:48:23 · 1 阅读

第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 开始。

选项

安装选项

--vers version
--version version

指定要安装的版本。这可以是一个版本约束(例如 ~1.2),Cargo 会根据该约束选择最新的版本。如果版本字符串中没有约束运算符(如 ^~),则必须遵循 MAJOR.MINOR.PATCH 格式,并精确安装该版本;它像 Cargo 依赖项那样被解析为“^”(caret)约束。

--git url

指定要从中安装指定 crate 的 Git 仓库 URL。

--branch branch

从 Git 仓库安装时使用的分支。

--tag tag

从 Git 仓库安装时使用的标签(Tag)。

--rev sha

从 Git 仓库安装时使用的特定提交(Commit)。

--path path

本地 crate 的文件系统路径,用于从中安装。

--list

列出所有已安装的包及其版本。

-n
--dry-run

(不稳定)执行所有检查,但不实际安装。

-f
--force

强制覆盖已存在的 crate 或二进制文件。当某个包安装的二进制文件与其他包重名时,可以用这个选项。此外,如果系统环境发生了变化(比如升级到了新版本的 rustc),想重新构建时也可以用它。

--no-track

默认情况下,Cargo 会在安装根目录下用一个元数据文件来跟踪已安装的包。此选项让 Cargo 不使用也不创建该文件。启用后,除非使用 --force,否则 Cargo 会拒绝覆盖任何已存在的文件。这同时也会禁用 Cargo 防止多个 Cargo 进程并发安装的保护机制。

--bin name

只安装指定的二进制文件。

--bins

安装所有二进制文件,这也是默认行为。

--example name

只安装指定的示例。

--examples

安装所有示例。

--root dir

安装包的目标目录。

--registry registry

使用的注册表名称。注册表名称在 Cargo 配置文件中定义。如果未指定,则使用默认注册表,该注册表由 registry.default 配置项定义,其默认值为 crates-io

--index index

使用的注册表索引 URL。

特性选择

特性标志允许你控制启用的特性。在未给出任何特性选项时,会为每个选定的包激活 default 特性。

更多详情请参见 特性文档

-F features
--features features

要激活的特性列表,以空格或逗号分隔。可以使用 package-name/feature-name 语法启用工作区成员的特性。此标志可以多次指定,从而激活所有指定的特性。

--all-features

激活所有选定包的全部可用特性。

--no-default-features

不激活所选软件包的 default feature。

编译选项

--target triple

为指定的目标架构安装。默认使用宿主架构。triple 的通用格式为 <arch><sub>-<vendor>-<sys>-<abi>

可能的取值:

  • rustc --print target-list 中列出的任何受支持的目标。
  • "host-tuple",该值会在内部被替换为宿主机的目标。这在交叉编译某些 crates 且不想将宿主机指定为目标时特别有用(例如,在由多个宿主机共同开发的共享项目中,xtask 可能用于不同环境)。
  • 自定义目标规范的路径。更多信息请参阅 Custom Target Lookup Path

也可以通过 build.target 配置值 进行指定。

请注意,指定此标志会使 Cargo 进入不同的运行模式,目标制品将被放置在单独的目录中。更多细节请参阅 build cache 文档。

--target-dir directory

用于存放所有生成的制品和中间文件的目录。也可以通过环境变量 CARGO_TARGET_DIRbuild.target-dir 配置值 进行指定。 默认为平台临时目录中新建的临时文件夹。

使用 --path 时,除非指定了 --target-dir,否则默认使用本地 crate 工作区中的 target 目录。

--debug

使用 dev profile 而非 release profile 进行构建。 如需按名称指定特定 profile,请参见 --profile 选项。

--profile name

使用指定的 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

其他选项

-j N
--jobs N

并行任务的运行数量。也可通过 build.jobs 配置项进行指定。默认值为逻辑 CPU 数量。若为负数,则最大并行任务数设置为逻辑 CPU 数量加上该负数的绝对值。若提供字符串 default,则恢复默认值。不应为 0。

--keep-going

尽可能构建依赖图中的所有 crate,而不是在遇到第一个构建失败时立即终止构建。

例如,若当前包依赖 failsworks 两个库,其中某一个编译失败,cargo install -j1 未必会构建那个成功的库(取决于 Cargo 先执行了两个库中的哪一个),而 cargo install -j1 --keep-going 则一定会尝试构建两者,即使先执行的那个失败了。

显示选项

-v
--verbose

使用详细输出。可指定两次以获得“极详细”输出,包含依赖项警告和构建脚本输出等额外信息。也可通过 term.verbose 配置项 指定。

-q
--quiet

不打印 Cargo 日志信息。也可通过 term.quiet 配置项 指定。

--color when

控制何时使用彩色输出。有效值如下:

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

也可通过 term.color 配置项 指定。

--message-format fmt

诊断信息的输出格式。可多次指定,由逗号分隔的值组成。有效值如下:

  • human(默认):以人类可读的文本格式输出。不能与 shortjson 同时使用。
  • short:输出更简短的人类可读文本信息。不能与 humanjson 同时使用。
  • json:向 stdout 输出 JSON 消息。详见参考文档。不能与 humanshort 同时使用。
  • json-diagnostic-short:确保 JSON 消息的 rendered 字段使用 rustc 的“short”渲染格式。不能与 humanshort 同时使用。
  • json-diagnostic-rendered-ansi:确保 JSON 消息的 rendered 字段内嵌 ANSI 颜色代码,以符合 rustc 的默认配色方案。不能与 humanshort 同时使用。
  • json-render-diagnostics:让 Cargo 不在输出的 JSON 消息中包含 rustc 的诊断信息,而是由 Cargo 自己渲染来自 rustc 的 JSON 诊断。Cargo 自身的 JSON 诊断以及来自 rustc 的其他诊断信息仍会正常输出。不能与 humanshort 同时使用。

通用选项

+toolchain

如果 Cargo 是通过 rustup 安装的,且 cargo 的第一个参数以 + 开头,它会被解析为 rustup 的工具链名称(例如 +stable+nightly)。 关于工具链覆盖机制的更多信息,请参阅 rustup 文档

--config KEY=VALUEPATH

覆盖 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 查看详细信息。

ENVIRONMENT

有关 Cargo 读取的环境变量详情,请参见参考文档

EXIT STATUS

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

EXAMPLES

  1. 从 crates.io 安装或升级软件包:

    cargo install ripgrep
    
  2. 安装或重新安装当前目录中的软件包:

    cargo install --path .
    
  3. 查看已安装软件包的列表:

    cargo install --list
    

SEE ALSO

cargo(1), cargo-uninstall(1), cargo-search(1), cargo-publish(1)

评论 (0)