帮助测试 Cargo 的新索引协议

2023 年 1 月 30 日 · Eric Huss 代表 Cargo 团队

Cargo 的新索引协议将从 Rust 1.68 版本开始提供,该版本将于 2023-03-09 发布。这个新的“稀疏”协议通常应该在访问 crates.io 时提供显著的性能提升。

我们希望您能帮助测试这个新特性和基础设施。如果您使用 beta (1.68) 或 nightly-2023-01-21 或更新版本,请设置环境变量 CARGO_REGISTRIES_CRATES_IO_PROTOCOL=sparse,或编辑您的 .cargo/config.toml 文件 以添加

[registries.crates-io]
protocol = "sparse"

我们希望听到您的使用体验报告。如果您遇到问题,请打开一个 issue。如果您想发布一般反馈,请随时在这个内部论坛主题上留言。

除了获取 crate 和运行 cargo update,我们还想听听您在运行 cargo publish 时是否有任何问题。另一个可能有用的数据点是衡量有多少用户位于限制性防火墙、代理或其他网络环境中,这些环境阻止了对索引的访问。

这项新服务将会在我们推出它并收集有关其性能的信息时选择启用。在不久的将来,我们打算将其切换为默认设置。

背景

为了让 Cargo 确定 crates.io 上存在哪些 crate,它会下载并读取一个“索引”,其中列出了所有 crate 的所有版本。该索引位于 GitHub 上托管的 git 仓库中。Cargo 会获取并将索引存储在 Cargo 的主目录中。该系统让 GitHub 处理服务器端处理,并提供了一种方便的方式来增量获取新更新。

然而,随着索引随着时间的推移而大幅增长,这个系统开始达到扩展限制,并且初始获取和更新继续减慢。您可能已经注意到当 Cargo 显示 Updating crates.io index 或在经历“解析差异”阶段时会出现暂停。

Updating crates.io index
    Fetch [=================>       ]  74.01%, (64415/95919) resolving deltas

通过 RFC 2789,我们引入了一种新的协议来改进 Cargo 访问索引的方式。它不是使用 git,而是直接通过 HTTPS 从索引中获取文件。Cargo 将只下载您的项目中特定 crate 依赖项的信息。

我们在 https://index.crates.io/ 上引入了一项新服务,用于托管 crates.io 索引。如果您位于限制性防火墙或代理之后,您可能需要明确允许 Cargo 访问此站点。

有关索引和此新的稀疏协议如何工作的更多信息,请参见文档

crates.io git 仓库将继续作为索引的真实来源,Cargo 将无限期地继续支持 git 索引。

致谢

我们非常感谢 Arlo Siemsen,他实现了这个特性,并为完成它付出了巨大的努力。我们还要感谢 crates.io 团队基础设施团队为实施、审查和支持这项工作所做出的贡献。我们还要感谢 GitHub 在过去 8 年里托管 crates.io 索引的慷慨支持。