Cargo 的新索引协议将从 Rust 1.68 版本开始可用,该版本将于 2023 年 3 月 9 日发布。这种新的 “sparse” 协议通常在访问 crates.io 时能显著提升性能。
我们希望您能帮助测试这项新功能和基础设施。如果您使用 beta (1.68) 或 nightly-2023-01-21 或更新版本,请设置环境变量 CARGO_REGISTRIES_CRATES_IO_PROTOCOL=sparse
,或者编辑您的 .cargo/config.toml
文件 添加
[]
= "sparse"
我们希望听到您使用后的反馈。如果您遇到问题,请提交一个 issue。如果您想提供一般性反馈,请随时在此 internals 讨论串中留言。
除了获取 crates 和运行 cargo update
外,我们还想了解您在运行 cargo publish
时是否遇到任何问题。另一个可能有用数据点是衡量有多少用户处于限制性防火墙、代理或其他阻止访问索引的网络环境中。
这项新服务在推广和收集其性能信息期间将是选择启用的。在不久的将来,我们打算将其设为默认。
背景
为了让 Cargo 确定 crates.io 上存在哪些 crate,它会下载并读取一个 “索引”,其中列出了所有 crate 的所有版本。该索引位于一个托管在 GitHub 上的 git 仓库中。Cargo 会将索引下载并存储在 Cargo 的主目录中。这个系统允许 GitHub 处理服务器端处理,并提供了一种方便的方式来增量获取新的更新。
然而,随着索引随时间显著增长,这个系统开始遇到扩展性限制,并且初次获取和更新的速度持续变慢。您可能注意到当 Cargo 显示 Updating crates.io index
或处于“解析增量 (resolving deltas)”阶段时会有停顿。
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 访问此站点。
关于索引和这个新 sparse 协议工作原理的更多信息可以在文档中找到。
crates.io git 仓库将继续作为索引的真相来源,并且 Cargo 将无限期地继续支持 git 索引。
致谢
我们衷心感谢 Arlo Siemsen,他实现了这项功能并付出了巨大努力将其完成。我们还要感谢 crates.io 团队 和 基础设施团队 对这项工作的实施、评审和支持。同时,我们也要感谢 GitHub 在过去八年里慷慨托管 crates.io 索引。