04-cargo package
7 分钟阅读
译文 · 基于 The Cargo Book
cargo-package(1)
原文链接: https://doc.rust-lang.org/cargo/commands/cargo-package.html
名称
cargo-package — 将本地包组装为可分发压缩包
大纲
cargo package [options]
描述
此命令会为当前目录中的包创建可分发、压缩的 .crate 文件(含源代码)。生成的文件保存在 target/package 目录中。执行步骤如下:
加载并检查当前工作空间,执行一些基本检查。
- 除非路径依赖带有 version 键,否则不允许使用路径依赖。Cargo 在已发布包中会忽略依赖的 path 键。
dev-dependencies不受此限制。
- 除非路径依赖带有 version 键,否则不允许使用路径依赖。Cargo 在已发布包中会忽略依赖的 path 键。
创建压缩的
.crate文件。- 原始
Cargo.toml文件会被重写并规范化。 - 清单中的
[patch]、[replace]与[workspace]节会被移除。 - 始终包含
Cargo.lock。若缺失,将生成新的锁文件,除非使用了--exclude-lockfile标志。若使用--locked标志,cargo-install(1) 会使用打包的锁文件。 - 包含
.cargo_vcs_info.json文件,其中记录当前 VCS 检出哈希(若可用),以及工作树是否 dirty 的标志。 - 符号链接会被展平为其目标文件。
- 根据
[include]与[exclude]字段 中的规则包含或排除文件与目录。
- 原始
解压
.crate文件并构建,以验证其可以构建。- 这会从头重新构建你的包,确保可以从干净状态构建。可用
--no-verify标志跳过此步骤。
- 这会从头重新构建你的包,确保可以从干净状态构建。可用
检查构建脚本是否修改了任何源文件。
包含的文件列表可通过清单中的 include 与 exclude 字段控制。
关于打包与发布的更多细节,见参考文档。
.cargo_vcs_info.json 格式
将生成如下格式的 .cargo_vcs_info.json:
| |
dirty 表示打包时 Git 工作树处于 dirty 状态。
path_in_vcs 对于版本控制仓库子目录中的包,会设置为相对于仓库的路径。
此文件的兼容性策略与 cargo-metadata(1) 的 JSON 输出相同。
请注意,此文件提供的是 VCS 信息的最佳努力快照。然而,包的来源并未被验证。无法保证压缩包中的源代码与 VCS 信息一致。
选项
打包选项
-l--list列出包中将包含的文件,但不实际创建包。
--no-verify不通过构建来验证内容。
--no-metadata忽略缺少人类可读元数据(如 description 或 license)的警告。
--allow-dirty允许打包含有未提交 VCS 变更的工作目录。
--exclude-lockfile打包时不包含锁文件。
此标志并非供一般使用。某些工具可能期望存在锁文件(例如
cargo install --locked)。使用前请考虑其他选项。--indexindex要使用的注册表索引 URL。
--registryregistry要为其打包的注册表名称;注册表名称的配置详见
cargo publish --help。包不会发布到该注册表,但若我们在打包多个相互依赖的 crate,锁文件将在假设依赖将发布到该注册表的前提下生成。--message-formatfmt指定输出消息格式。目前仅与
--list配合使用,并影响文件列表格式。此功能不稳定,需要-Zunstable-options。有效输出格式:human(默认):每行一个文件的格式显示。json:输出关于每个包的机器可读 JSON 信息。每个包一行 JSON(换行分隔的 JSON)。{ /* 包的 Package ID Spec。 */ "id": "path+file:///home/foo#0.0.0", /* 此包的文件 */ "files" { /* 归档文件中的相对路径。 */ "Cargo.toml.orig": { /* 文件来源。 - "generate" 表示打包过程中生成的文件 - "copy" 表示从其他位置复制的文件 */ "kind": "copy", /* 对于 "copy" 类型, 为实际文件内容的绝对路径。 对于 "generate" 类型, 为生成文件所基于的原始文件。 */ "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-path,则基于当前工作目录)。若清单是工作空间的根,则选择工作空间的默认成员;否则仅选择清单定义的包。
工作空间的默认成员可在根清单中通过 workspace.default-members 键显式设置。若未设置,虚拟工作空间将包含所有工作空间成员(等价于传入 --workspace),非虚拟工作空间则仅包含根 crate 本身。
-pspec…--packagespec…仅打包指定的包。SPEC 格式见 cargo-pkgid(1)。此标志可指定多次,并支持常见的 Unix glob 模式,如
*、?和[]。不过,为避免 shell 在 Cargo 处理之前意外展开 glob 模式,必须用单引号或双引号括住每个模式。--workspace打包工作空间中的所有成员。
--excludeSPEC…排除指定的包。必须与
--workspace标志一起使用。此标志可指定多次,并支持常见的 Unix glob 模式,如*、?和[]。不过,为避免 shell 在 Cargo 处理之前意外展开 glob 模式,必须用单引号或双引号括住每个模式。
编译选项
--targettriple为指定目标架构打包。此标志可指定多次。默认为宿主架构。三元组的一般格式为
<arch><sub>-<vendor>-<sys>-<abi>。可能的值:
rustc --print target-list中支持的任意目标。"host-tuple",内部将替换为宿主目标。若你在交叉编译某些 crate,且不想将宿主机器指定为目标(例如多人协作的共享项目中的xtask),这会特别有用。- 自定义目标规范的路径。更多信息见 Custom Target Lookup Path。
也可通过
build.target配置值 指定。请注意,指定此标志会使 Cargo 以不同模式运行,目标产物将放在单独的目录中。更多细节见 构建缓存文档。
--target-dirdirectory所有生成产物与中间文件的目录。也可通过
CARGO_TARGET_DIR环境变量或build.target-dir配置值 指定。默认为工作空间根目录下的target。
特性选择
特性标志用于控制启用哪些特性。若未指定特性选项,每个所选包都会激活 default 特性。
参见特性文档了解更多详情。
-Ffeatures--featuresfeatures空格或逗号分隔的要激活的特性列表。工作空间成员的特性可用
package-name/feature-name语法启用。此标志可指定多次,以启用所有指定的特性。--all-features激活所有所选包的全部可用特性。
--no-default-features不激活所选包的
default特性。
清单选项
--manifest-pathpathCargo.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,而不是在第一个构建失败的 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 配置值。参数应为 TOML 语法的
KEY=VALUE,或指向额外配置文件的路径。此标志可指定多次。更多信息见 命令行覆盖一节。-CPATH在执行任何指定操作之前更改当前工作目录。这会影响 Cargo 默认查找项目清单(
Cargo.toml)的位置,以及用于发现.cargo/config.toml的目录搜索等。此选项必须出现在命令名称之前,例如cargo -C path/to/my-project build。此选项仅在 nightly 通道 上可用,且需要
-Z unstable-options标志才能启用(见 #10098)。-h--help打印帮助信息。
-ZflagCargo 的不稳定(仅 nightly)标志。运行
cargo -Z help查看详情。
环境
关于 Cargo 读取的环境变量详情,见参考文档。
退出状态
0:Cargo 成功。101:Cargo 未能完成。
示例
为当前包创建压缩的
.crate文件:cargo package