测试调用:Cargo sparse-registry

2022 年 6 月 22 日 · Arlo Siemsen 代表 Cargo 团队 发布

注意:稀疏注册表支持已在 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 索引随着新包的发布而不断增长,客户端必须下载整个索引。HTTP 索引只需要下载依赖树中包的元数据。

客户端的性能提升在 CI 环境中尤其明显,尤其是在没有本地索引缓存的情况下。

在服务器端,HTTP 协议在 CDN 上更容易缓存,这提高了可扩展性并减少了服务器负载。由于这种缓存,包更新可能需要额外的一分钟才能出现在索引中。

Cargo 团队计划最终将此作为访问 crates.io 的默认方式(尽管 git 索引将保留以与旧版本的 Cargo 和外部工具兼容)。Cargo.lock 文件将继续引用 GitHub 上现有的 crates.io 索引,以避免混乱。

-Z sparse-registry 标志还允许通过 HTTP 访问替代注册表。有关更多详细信息,请参阅 跟踪问题

感谢

该项目已经进行了两年半以上,得到了 crates.io、基础设施和 Cargo 团队的合作。

@kornelski 编写了 稀疏索引 RFC 和最初的性能概念验证。 @jonhoo 在 Cargo 中创建了初始实现并收集了性能数据。 @arlosi 完成了 Cargo 中的实现并实施了对 crates.io 的更改以提供索引。 @eh2406 提供了大量审查和反馈,使所有更改得以落地。社区中的许多其他人通过提供建议、反馈和测试提供了帮助。

感谢所有参与的人!