第66章 Cargo 包管理:本地包打包与发布指南
名称
cargo-package — 将本地 package 打包为可分发的 tarball
概要
cargo package [options]
描述
该命令会把当前目录中 package 的源代码打包成一个可分发的压缩 .crate 文件,生成的文件存放在 target/package 目录下。整个过程包括以下步骤:
-
加载并检查当前 workspace,执行一些基础校验。
- 不允许使用 Path 依赖,除非指定了 version。发布 package 时,Cargo 会忽略依赖中的 path 字段。
dev-dependencies不受此限制。
- 不允许使用 Path 依赖,除非指定了 version。发布 package 时,Cargo 会忽略依赖中的 path 字段。
-
创建压缩的
.crate文件。- 原始的
Cargo.toml文件会被重写并规范化。 - manifest 中的
[patch]、[replace]和[workspace]段会被移除。 - 始终包含
Cargo.lock。如果缺少该文件,会自动生成新的 lock 文件,除非使用了--exclude-lockfile标志。使用--locked标志时,cargo-install(1) 会采用打包内的 lock 文件。 - 包含一个
.cargo_vcs_info.json文件,记录当前 VCS checkout 的 hash(如果可用),以及工作区是否有未提交修改的标志。 - 符号链接会被替换为其指向的目标文件。
- 文件和目录按照
[include]和[exclude]字段中描述的规则来决定是否打包。
- 原始的
-
解压
.crate文件并进行构建,验证其可构建。- 这一步会从头完整重新构建 package,确保它能在干净状态下成功构建。可以使用
--no-verify标志跳过此步骤。
- 这一步会从头完整重新构建 package,确保它能在干净状态下成功构建。可以使用
-
检查 build scripts 是否修改了任何源文件。
可以通过 manifest 中的 include 和 exclude 字段控制打包时包含哪些文件。
更多关于打包和发布的细节,请参阅参考文档。
.cargo_vcs_info.json 格式
将生成如下格式的 .cargo_vcs_info.json 文件
{
"git": {
"sha1": "aac20b6e7e543e6dd4118b246c77225e3a3a1302",
"dirty": true
},
"path_in_vcs": ""
}
dirty 表示构建包时 Git 工作区处于未提交状态。
若包位于版本控制仓库的子目录中,path_in_vcs 会被设置为相对于仓库根目录的路径。
该文件的兼容性维护策略与 cargo-metadata(1) 的 JSON 输出保持一致。
请注意,此文件仅提供版本控制信息的一个尽力而为的快照。包的真实来源并未经过验证,无法保证 tarball 中的源代码与版本控制信息完全匹配。
OPTIONS
Package Options
-l--list-
仅打印包中包含的文件列表,不实际创建包。
--no-verify-
不通过构建来验证包内容。
--no-metadata-
忽略关于缺少人类可读元数据(如描述或许可证)的警告。
--allow-dirty-
允许将包含未提交版本控制变更的工作目录打包。
--exclude-lockfile-
打包时不包含锁文件。
此参数不用于常规用途。某些工具可能期望存在 lock file(例如
cargo install --locked)。使用此参数前,请先考虑其他选项。 --indexindex-
要使用的 registry index 的 URL。
--registryregistry-
要为之打包的 registry 名称;有关 registry 名称配置的详细信息,请参阅
cargo publish --help。这些包不会被发布到该 registry,但如果正在打包多个相互依赖的 crate,lock file 将基于“依赖项将发布到该 registry”这一假设生成。 --message-formatfmt-
指定输出消息格式。目前仅与
--list配合生效,影响文件列表的显示格式。此功能处于不稳定状态,需使用-Zunstable-options。有效的输出格式:human(默认):以每行一个文件的格式显示。json:为每个包输出机器可读的 JSON 信息。每个 JSON 对象占一行(换行分隔的 JSON)。{ /* The Package ID Spec of the package. */ "id": "path+file:///home/foo#0.0.0", /* Files of this package */ "files" { /* Relative path in the archive file. */ "Cargo.toml.orig": { /* Where the file is from. - "generate" for file being generated during packaging - "copy" for file being copied from another location. */ "kind": "copy", /* For the "copy" kind, it is an absolute path to the actual file content. For the "generate" kind, it is the original file the generated one is based on. */ "path": "/home/foo/Cargo.toml" }, "Cargo.toml": { "kind": "generate", "path": "/home/foo/Cargo.toml" }, "src/main.rs": { "kind": "copy", "path": "/home/foo/src/main.rs" } } }
包选择
默认情况下,如果没有给出包选择选项,选择哪些包取决于所选的 manifest 文件(如果未指定 --manifest-path,则基于当前工作目录)。如果 manifest 是 workspace 的根,则选择 workspace 的默认成员,否则只选择该 manifest 定义的包。
workspace 的默认成员可以在根 manifest 中通过 workspace.default-members 键显式设置。如果没有设置,虚拟 workspace 会包含所有成员(等同于传入 --workspace),而非虚拟 workspace 则只包含根 crate 本身。
-pspec…--packagespec…-
只打包指定的包。SPEC 格式参见 cargo-pkgid(1)。此标志可以指定多次,并支持
*、?、[]等常见 Unix glob 模式。不过,为避免 shell 在 Cargo 处理之前误展开 glob 模式,每个模式都需要用单引号或双引号包裹。 --workspace-
打包 workspace 中的所有成员。
--excludeSPEC…-
排除指定的包,必须与
--workspace标志一起使用。此标志可以指定多次,并支持*、?、[]等常见 Unix glob 模式。不过,为避免 shell 在 Cargo 处理之前误展开 glob 模式,每个模式都需要用单引号或双引号包裹。
编译选项
--targettriple-
为指定目标架构打包。该标志可多次指定。默认值为宿主架构。triple 的通用格式为
<arch><sub>-<vendor>-<sys>-<abi>。可选值:
rustc --print target-list中列出的任意受支持目标。"host-tuple",内部会替换为宿主目标。在交叉编译部分 crate 且不希望将宿主机器指定为目标时(例如共享项目中供多种宿主使用的xtask)特别有用。- 自定义 target specification 的路径。更多信息请参阅 Custom Target Lookup Path。
也可以通过
build.target配置项指定。注意,指定该标志会使 Cargo 以不同模式运行,目标构建产物将放置在独立目录中。详见 构建缓存文档。
--target-dirdirectory-
存放所有生成产物和中间文件的目录。也可通过环境变量
CARGO_TARGET_DIR或build.target-dir配置项指定。默认为工作区根目录下的target。
特性选择
特性标志可用于控制启用哪些特性。若未提供特性选项,则默认激活每个选定包的 default 特性。
更多细节请参阅 特性文档。
-Ffeatures--featuresfeatures-
以空格或逗号分隔的特性列表,用于启用指定特性。工作区成员的特性可通过
包名/特性名语法启用。该参数可多次指定,以启用所有列出的特性。 --all-features-
启用所有选定包的全部可用特性。
--no-default-features-
不启用选定包的
default特性。
Manifest Options
--manifest-pathpath-
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。
其他选项
-jN--jobsN-
并行任务数。也可以通过
build.jobs配置项 指定,默认值为逻辑 CPU 数量。如果为负数,则最大并行任务数为逻辑 CPU 数加上该值。如果传入字符串default,则恢复为默认值。不能设为 0。 --keep-going-
尽可能多地构建依赖图中的 crate,而不是在第一个构建失败时就中止整个构建。
举例来说,假设当前包依赖于
fails和works两个依赖项,其中有一个构建失败。在这种情况下,运行cargo package -j1时,那个成功的包可能构建也可能不构建(这取决于 Cargo 最初选择先运行哪一个),而cargo package -j1 --keep-going则一定会运行这两个构建任务,即使先执行的那个失败了。
显示选项
-v--verbose-
使用详细输出模式。可指定两次以启用“非常详细”的输出,这会包含依赖项警告和构建脚本输出等额外信息。也可通过
term.verbose配置值进行设置。 -q--quiet-
不打印 Cargo 日志消息。也可通过
term.quiet配置值进行设置。 --colorwhen-
控制何时使用彩色输出。有效值如下:
auto(默认):自动检测终端是否支持颜色。always:始终显示颜色。never:从不显示颜色。
也可通过
term.color配置值进行设置。
通用选项
+toolchain-
若 Cargo 是通过 rustup 安装的,且
cargo的第一个参数以+开头,该参数将被解析为 rustup 工具链名称(例如+stable或+nightly)。有关工具链覆盖机制的详细信息,请参阅rustup 文档。 --configKEY=VALUE or PATH-
覆盖 Cargo 的配置值。参数可以是
KEY=VALUE形式的 TOML 语法,也可以是额外配置文件的路径。此标志可多次指定。更多信息请参阅命令行覆盖章节。 -CPATH-
在执行指定操作前更改当前工作目录。这会影响 Cargo 默认查找项目清单(
Cargo.toml)的位置,以及搜索.cargo/config.toml的目录范围等。此选项必须出现在命令名称之前,例如cargo -C path/to/my-project build。此选项仅在nightly 通道可用, 且需添加
-Z unstable-options标志才能启用(参见 #10098)。 -h--help-
打印帮助信息。
-Zflag-
传递给 Cargo 的不稳定(仅 nightly 版)标志。运行
cargo -Z help查看详情。
环境变量
Cargo 读取的环境变量详见参考文档。
退出状态
0:Cargo 执行成功。101:Cargo 执行失败。
示例
-
为当前包创建压缩的
.crate文件:cargo package