太长不看
- 我们希望提升 crate 下载的可靠性和性能。
- “非规范下载”(即下载 URL 中包含连字符或下划线,而发布的 crate 名称中使用了相反的符号)正在阻碍这些计划。
- 自 2023 年 11 月 20 日起,我们将禁用对“非规范下载”的支持。
- cargo 用户不受影响。
什么是“非规范下载”?
“非规范下载”功能允许用户不仅可以通过 https://crates.io/api/v1/crates/serde_derive/1.0.189/download 下载 serde_derive
crate,也可以通过 https://crates.io/api/v1/crates/SERDE-derive/1.0.189/download 进行下载。在后一个 URL 中,下划线被替换为连字符(crates.io 会将下划线和连字符视为相同以便确保唯一性,因此如果 serde_derive
已经存在,就不可能发布名为 serde-derive
的 crate),并且 crate 名称的一部分使用了大写字母。反之亦然,如果规范 crate 名称使用连字符,下载 URL 使用下划线也可以。对于包含多个此类字符的 crate,它甚至适用于任何其他组合(请不要混用它们…!)。
为什么要移除它?
支持这种非规范下载请求意味着 crates.io 服务器需要对每个下载请求执行数据库查找,以确定规范的 crate 名称。然后,该规范名称被用于构建下载 URL,客户端会被 HTTP 重定向到该 URL。
虽然我们在一段时间前引入了缓存层来解决一些性能问题,但让所有下载请求都通过我们的后端服务器仍然开始变得棘手,并且以当前的增长速度,未来只会变得更加困难。
然而,必须支持“非规范下载”阻碍了我们直接使用 CDN 处理下载请求,因此如果我们能移除对非规范下载请求的支持,将显著提升性能和可靠性。
谁正在使用“非规范下载”?
cargo
始终使用包索引中的规范 crate 名称来构建相应的下载 URL。即使 crates.io 方面移除了这项支持,cargo 仍然会像以前一样正常工作。
查看 crates.io 请求日志,以下用户代理当前依赖于对“非规范下载”的支持:
- cargo-binstall/1.1.2
- Faraday v0.17.6
- Go-http-client/2.0
- GNU Guile
- python-requests/2.31.0
其中三个是通用的 HTTP 客户端库。GNU Guile 显然是一种编程语言,因此这也很可能是来自用户自定义程序的通用用户代理。
cargo-binstall
是一个用于安装 crate 的二进制制品的工具。其维护者已经知晓即将到来的变化,并确认较新版本的 cargo-binstall
不应受到此更改的影响。
我们建议任何依赖非规范下载的脚本进行调整,转而使用来自包索引、数据库转储或 crates.io API 的规范名称。如果您不确定哪种数据源最适合您,欢迎您查看 crates.io 数据访问页面。
计划是什么?
- 今天:在 Rust 官方博客上宣布移除对非规范下载的支持。
- 2023 年 11 月 20 日:禁用对非规范下载的支持,并返回迁移错误消息以提醒仍然使用此功能的用户需要迁移。这仍然需要应用负载来检测请求是否使用了非规范下载 URL。
- 2023 年 12 月 18 日:返回常规的 404 错误,而不是迁移错误消息,这将使我们能够摆脱(部分)数据库查询。
请注意,目前出于下载计数目的,我们仍然需要数据库查询。我们也计划移除此要求,但这些工作被我们仍在支持非规范下载所阻碍。
如果您想关注这些更改的实施进展或有任何意见,可以订阅相应的跟踪议题。相关讨论也在 crates.io Zulip 流中进行。