crates.io: 放弃对非规范下载的支持

2023年10月27日 · Tobias Bieniek 代表 crates.io 团队

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 数据访问页面

计划是什么?

  1. 今天: 在 Rust 主博客上宣布删除对非规范下载的支持。
  2. 2023-11-20: 禁用对非规范下载的支持,并返回迁移错误消息,以提醒此功能的剩余用户需要迁移。这仍然需要在应用程序上加载以检测请求是否正在使用非规范的下载 URL。
  3. 2023-12-18: 返回常规的 404 错误,而不是迁移错误消息,这使我们可以摆脱(部分)数据库查询。

请注意,我们目前仍然需要数据库查询来进行下载计数。我们有计划取消此要求,但是由于我们仍然支持非规范下载,这些工作被阻止了。

如果您想跟进实施这些更改的进度,或者您有任何意见,您可以订阅相应的 跟踪问题。相关讨论也在 crates.io Zulip 流中进行。