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

第67章 Cargo publish:将包发布至注册表

名称

cargo-publish — 将包上传到注册表

用法

cargo publish [选项]

描述

该命令会将当前目录下的包源代码打包为可分发的压缩 .crate 文件,并上传至注册表。默认注册表为 https://crates.io。其执行流程如下:

  1. 执行若干检查,包括:
    • 检查 manifest 中的 package.publish 键,确认允许发布到哪些注册表。
  2. 按照 cargo-package(1) 中的步骤创建 .crate 文件。
  3. 将 crate 上传至注册表,服务器会对其执行额外的校验。
  4. 客户端会轮询等待包出现在索引中,此过程可能会超时。若超时,需手动检查是否完成,但这不影响上传操作本身。

执行该命令前,需通过 cargo-login(1) 进行身份认证,或设置 registry.tokenregistries.<name>.token 等环境变量。

有关打包与发布的更多细节,请参阅参考文档

选项

发布选项

--dry-run

执行所有检查但不上传。

--no-verify

不通过构建来验证内容。

--allow-dirty

允许将包含未提交 VCS 变更的工作目录进行打包。

--index index

要使用的 registry index 的 URL。

--registry registry

要发布到的 registry 名称。Registry 名称定义在 Cargo 配置文件中。如果未指定该选项,且 Cargo.toml 中的 package.publish 字段只包含一个 registry,则发布到该 registry。否则使用默认 registry,即由 registry.default 配置项定义的 registry,默认值为 crates-io

包选择

默认情况下,如果没有指定包选择选项,所选的包取决于选定的 manifest 文件(未指定 --manifest-path 时,基于当前工作目录)。如果该 manifest 是某个 workspace 的根目录,则选择 workspace 的默认成员,否则只选择该 manifest 定义的包。

可以在根 manifest 中通过 workspace.default-members 配置项显式设置 workspace 的默认成员。如果没有设置,虚拟 workspace 会包含所有成员(相当于传入 --workspace),非虚拟 workspace 则只包含根 crate 本身。

-p spec
--package spec

只发布指定的包。SPEC 格式参见 cargo-pkgid(1)。该参数可以多次指定,并支持 *?[] 等常见的 Unix glob 模式。不过,为避免 shell 在 Cargo 处理之前意外展开 glob 模式,每个模式都必须用单引号或双引号包裹。

--workspace

发布工作区中的所有成员。

--all

已弃用,作为 --workspace 的别名。

--exclude SPEC

排除指定的包。必须与 --workspace 标志配合使用。该标志可以多次指定,并支持常见的 Unix 通配符模式,如 *?[]。但为了防止 Shell 在 Cargo 处理之前意外展开这些通配符模式,你必须为每个模式添加单引号或双引号。

编译选项

--target triple

为指定的目标架构发布。该标志可以多次指定。默认为主机架构。三元组的一般格式为 <arch><sub>-<vendor>-<sys>-<abi>

可能的值:

  • rustc --print target-list 中列出的任何受支持的目标。
  • "host-tuple",内部会替换为主机的目标。这在跨编译某些 crates 时特别有用,如果你不想将主机机器指定为目标(例如,在一个多人协作的共享项目中,不同主机运行的 xtask)。
  • 自定义目标规格的路径。更多信息请参阅 自定义目标查找路径

也可以通过 配置值 中的 build.target 来指定。

注意:指定此标志会让 Cargo 运行在另一种模式,目标产物会生成到独立目录。详见 构建缓存 文档。

--target-dir directory

存放所有生成产物及中间文件的目录。也可通过环境变量 CARGO_TARGET_DIR 或配置项 build.target-dir 配置值 指定。默认为工作区根目录下的 target

特性选择

特性标志用于控制启用哪些特性。若未提供特性选项,会为每个选中的包激活 default 特性。

更多细节请参阅特性文档

-F features
--features features

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

--all-features

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

--no-default-features

不激活所选包的 default 特性。

清单选项

--manifest-path path

指定 Cargo.toml 文件的路径。默认情况下,Cargo 会在当前目录及其所有上级目录中查找 Cargo.toml 文件。

--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,而不是在第一个构建失败的 crate 处终止构建。

例如,如果当前包依赖于 failsworks,且其中一个构建失败,cargo publish -j1 可能构建也可能不构建那个成功的(取决于 Cargo 选择先运行哪一个),而 cargo publish -j1 --keep-going 则肯定会运行这两个构建,即使先运行的那个失败了。

Display Options

-v
--verbose

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

-q
--quiet

不输出 cargo 日志信息。也可通过 term.quiet 配置项 进行设置。

--color when

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

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

也可通过 term.color 配置项 进行设置。

通用选项

+toolchain

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

--config KEY=VALUEPATH

覆盖某个 Cargo 配置项。参数应采用 TOML 语法的 KEY=VALUE 形式,或指定为额外配置文件的路径。此选项可多次指定。更多信息请参阅命令行覆盖章节。

-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 查看详情。

环境变量

Cargo 读取的环境变量详见参考文档

退出状态

  • 0:Cargo 执行成功。
  • 101:Cargo 执行失败。

示例

  1. 发布当前包:

    cargo publish
    

另请参阅

cargo(1)cargo-package(1)cargo-login(1)

评论 (0)