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

第68章 Cargo Yank:从注册表索引中移除已发布的 crate

名称

cargo-yank — 从索引中移除已发布的 crate

用法

cargo yank [选项] crate@版本
cargo yank [选项] --version 版本 [crate]

描述

yank 命令会将之前发布的 crate 版本从服务器索引中移除。该命令不会删除任何数据,你仍可通过注册表的下载链接获取该 crate。

对于没有现有 lockfile 的新项目或代码检出,Cargo 不会使用已 yank 的版本;如果该 crate 没有兼容版本可用,Cargo 会报错。

使用此命令需要通过 --token 选项或 cargo-login(1) 完成身份验证。

如果未指定 crate 名称,系统将使用当前目录下的包名。

yank 的工作机制

假设 foo crate 发布了 1.5.0 版本,另一个 crate bar 声明依赖 foo = "1.5"。随后 foo 发布了不兼容 SemVer 的新版本 2.0.0,并发现 1.5.0 存在严重问题。如果将 1.5.0 yank,由于 bar 依赖 1.5,所有没有现有 lockfile 的新项目或代码检出将无法使用 crate bar

在这种情况下,foo 的维护者应在 yank 1.5.0 之前先发布一个 SemVer 兼容版本(例如 1.5.1),以确保 bar 及所有依赖 bar 的项目继续正常运行。

另一个例子:假设 crate bar 发布了 1.5.01.5.11.5.22.0.03.0.0 版本。在下表中,假设某个版本被 yank,列出在缺少 lockfile 时,不同 SemVer 依赖要求下 Cargo 可能使用的版本:

已 yank 版本 / SemVer 要求bar = "1.5.0"bar = "=1.5.0"bar = "2.0.0"
1.5.0使用 1.5.11.5.2 返回错误使用 2.0.0
1.5.1使用 1.5.01.5.2使用 1.5.0使用 2.0.0
2.0.0使用 1.5.01.5.11.5.2使用 1.5.0返回错误

何时使用 yank

只有在特殊情况下才应该 yank 一个 crate,例如误发布、无意中破坏了 SemVer 兼容性,或者 crate 严重损坏无法使用。如果涉及安全漏洞,通常用 RustSec 通知用户并促使其升级是影响更小的方式,还能避免对下游造成大规模干扰——无论下游是否真的受该漏洞影响。

常见做法是:在已经发布了 semver 兼容的新版本之后,再 yank 旧版本,以降低导致依赖它的 crate 无法编译的概率。

如果已发布的 crate 存在版权、许可证或个人数据方面的问题,仅仅 yank 可能不够。这种情况下请联系你所使用的 registry 的维护者。对于 crates.io,请查阅其政策并通过 help@crates.io 联系他们。

如果凭证已经泄露,建议立即撤销。crate 一旦发布,就无法确定泄露的凭证是否已被复制。yank 只是让 Cargo 在默认解析依赖时不选择这个版本,已有的 lock 文件和直接下载都不受影响,因此 yank 无法阻止已泄露的凭证继续扩散。

OPTIONS

Yank 选项

--vers version
--version version

要 yank 或取消 yank 的版本。

--undo

撤销 yank 操作,将版本重新放回索引中。

--token token

用于认证的 API token。此参数将覆盖凭证文件(由 cargo-login(1) 创建)中存储的 token。

可通过 Cargo 配置中的环境变量来覆盖凭证文件中存储的 token。crates.io 的 token 可通过环境变量 CARGO_REGISTRY_TOKEN 指定。其他 registry 的 token 可通过形如 CARGO_REGISTRIES_NAME_TOKEN 的环境变量指定,其中 NAME 为 registry 名称(全大写)。

--index index

要使用的 registry 索引 URL。

--registry registry

要使用的 registry 名称。Registry 名称在 Cargo 配置文件中定义。若未指定,则使用默认 registry,其由 registry.default 配置项定义,默认值为 crates-io

显示选项

-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. 从索引中撤回一个 crate:

    cargo yank foo@1.0.7
    

另请参阅

cargo(1)cargo-login(1)cargo-publish(1)

评论 (0)