注意:稀疏注册表支持已在 1.68 版本中稳定。请参阅 帮助测试 Cargo 的新索引协议 以获取更新的信息。
Cargo nightly sparse-registry
功能已准备好进行测试。此功能使 Cargo 通过 HTTP 访问 crates.io 索引,而不是 git。它可以显著提高性能,特别是当 git 索引的本地副本过时或尚未克隆时。
概述
要尝试它,请在最近的 Cargo nightly 版本中添加 -Z sparse-registry
标志。例如,要更新依赖项
rustup update nightly
cargo +nightly -Z sparse-registry update
也可以通过设置环境变量 CARGO_UNSTABLE_SPARSE_REGISTRY=true
来启用此功能。设置此变量对稳定的 Cargo 没有影响,使其易于选择加入 CI 作业。
最低 Cargo 版本为 cargo 2022-06-17
,它与 rustc 2022-06-20
打包在一起。
您可以在 内部讨论帖子上留下反馈。
如果您发现任何问题,请在 Cargo 仓库中报告。设置环境变量 CARGO_LOG=cargo::sources::registry::http_remote=trace
后 Cargo 的输出将有助于调试。
详细信息
通过 HTTP 访问索引允许 crates.io 继续增长而不会妨碍性能。当前的 git 索引随着新 crate 的发布而持续增长,客户端必须下载整个索引。HTTP 索引仅需要下载依赖树中 crate 的元数据。
客户端的性能提升在 CI 环境中应该尤其明显,尤其是在不存在索引的本地缓存的情况下。
在服务器端,HTTP 协议更容易在 CDN 上缓存,这提高了可扩展性并降低了服务器负载。由于这种缓存,crate 更新可能需要额外一分钟才会出现在索引中。
Cargo 团队计划最终使此成为访问 crates.io 的默认方式(尽管 git 索引将保留以兼容旧版本的 Cargo 和外部工具)。Cargo.lock
文件将继续引用 GitHub 上现有的 crates.io 索引,以避免动荡。
-Z sparse-registry
标志还允许通过 HTTP 访问替代注册表。有关更多详细信息,请参阅 跟踪问题。
感谢
该项目历时 2.5 年多,由 crates.io、infra 和 Cargo 团队合作完成。
@kornelski 编写了 sparse-index RFC 和初始性能概念验证。@jonhoo 在 Cargo 中创建了初始实现并收集了性能数据。@arlosi 完成了 Cargo 中的实现,并实现了对 crates.io 的更改以提供索引。@eh2406 提供了大量的审查和反馈,以使所有更改都得到落实。社区中的许多其他人通过提供建议、反馈和测试提供了帮助。
感谢所有参与者!