征集测试:Cargo sparse-registry

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

注意:Sparse registry 支持已在 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 来启用。在 stable 版本的 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、基础设施和 Cargo 团队协作完成。

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

感谢所有参与者!