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 索引的慷慨支持。