TL;DR
- 我们希望提高 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 下载,其中下划线被替换为连字符(crates.io 将下划线和连字符规范化为相同,以确保唯一性,因此无法发布名为 serde-derive
的 crate,因为 serde_derive
已经存在),并且 crate 名称的部分使用大写字母。反之亦然,如果规范的 crate 名称使用连字符,而下载 URL 使用下划线,则同样适用。它甚至适用于任何其他组合,对于具有多个此类字符的 crate(请不要混合使用它们……!)。
为什么移除它?
支持此类非规范下载请求意味着 crates.io 服务器需要对每个下载请求执行数据库查找,以确定规范的 crate 名称。然后使用规范的 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 流 中进行。