第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.0、1.5.1、1.5.2、2.0.0 和 3.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.1 或 1.5.2 |
返回错误 | 使用 2.0.0 |
1.5.1 | 使用 1.5.0 或 1.5.2 | 使用 1.5.0 | 使用 2.0.0 |
2.0.0 | 使用 1.5.0、1.5.1 或 1.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 选项
--versversion--versionversion-
要 yank 或取消 yank 的版本。
--undo-
撤销 yank 操作,将版本重新放回索引中。
--tokentoken-
用于认证的 API token。此参数将覆盖凭证文件(由 cargo-login(1) 创建)中存储的 token。
可通过 Cargo 配置中的环境变量来覆盖凭证文件中存储的 token。crates.io 的 token 可通过环境变量
CARGO_REGISTRY_TOKEN指定。其他 registry 的 token 可通过形如CARGO_REGISTRIES_NAME_TOKEN的环境变量指定,其中NAME为 registry 名称(全大写)。 --indexindex-
要使用的 registry 索引 URL。
--registryregistry-
要使用的 registry 名称。Registry 名称在 Cargo 配置文件中定义。若未指定,则使用默认 registry,其由
registry.default配置项定义,默认值为crates-io。
显示选项
-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 或 PATH-
覆盖 Cargo 配置值。参数应为 TOML 语法的
KEY=VALUE形式,或指定为额外配置文件的路径。该选项可多次指定。 更多信息请参阅命令行覆盖章节。 -CPATH-
在执行任何指定的操作之前,先切换当前工作目录。这会影响 Cargo 默认查找项目清单(
Cargo.toml)的位置,以及搜索.cargo/config.toml的目录等。该选项必须放在命令名之前,例如cargo -C path/to/my-project build。此选项仅在 nightly channel 上可用,且需要
-Z unstable-options标志来启用(参见 #10098)。 -h--help-
打印帮助信息。
-Zflag-
传递给 Cargo 的不稳定(仅 nightly)标志。运行
cargo -Z help查看详情。
环境变量
Cargo 可读取的环境变量详见参考文档。
退出状态
0:Cargo 执行成功。101:Cargo 执行失败。
示例
-
从索引中撤回一个 crate:
cargo yank foo@1.0.7