crates.io:开发更新

2025 年 2 月 5 日 · Tobias Bieniek 代表 crates.io 团队

早在 2024 年 7 月,我们发布了一篇关于 crates.io 持续开发的博文。 自那时以来,我们取得了很大进展并发布了一些新功能。在这篇博文中,我们想向您介绍我们对 crates.io 所做的最新更改。

Crate 删除

RFC #3660 中,我们提出了一个新功能,允许 crate 所有者在特定条件下从 crates.io 中删除他们的 crate。 如果您错误地发布了一个 crate,或者您想删除一个不再维护的 crate,这将非常有用。 在 RFC 于 8 月底被所有团队成员接受后,我们开始实施该功能。

我们创建了一个新的 API 端点 DELETE /api/v1/crates/:name,允许 crate 所有者删除他们的 crate,然后创建了相应的用户界面。 如果您是 crate 的所有者,您现在可以转到 crate 页面,打开“设置”选项卡,并在底部找到“删除此 crate”按钮。 单击此按钮将引导您到一个确认页面,告诉您删除的潜在影响以及删除 crate 需要满足的要求

Delete Page Screenshot

正如您从上面的屏幕截图中所看到的,只有在以下情况下才能删除 crate:crate 发布时间少于 72 小时,或者 crate 只有一个所有者,并且 crate 在发布的每个月中下载次数少于 500 次,并且 crate 没有被 crates.io 上的任何其他 crate 所依赖。

实施这些要求是为了防止滥用删除功能,并确保社区广泛使用的 crate 不会被意外删除。 如果您对此功能有任何反馈,请告诉我们!

OpenAPI 描述

在假期前后,我们开始尝试为 crates.io API 生成 OpenAPI 描述。 这是社区长期以来的请求,我们很高兴地宣布,我们现在在 https://crates.io/api/openapi.json 提供了一个实验性的 OpenAPI 描述!

请注意,这仍然被认为是正在进行的工作,例如,端点的稳定性保证尚未写下来,响应模式也尚未完全记录。

您可以在 Swagger UI 中查看 OpenAPI 描述,例如在 https://petstore.swagger.io/ 中,通过在顶部输入字段中输入 https://crates.io/api/openapi.json。 我们决定暂时不自己提供查看器,因为担心在与 crates.io 本身相同的域上运行它存在安全隐患。 如果有足够的兴趣,我们可能会重新考虑是否在专用子域上提供它。

Swagger UI Screenshot

OpenAPI 描述由 utoipa crate 生成,这是一个可以与 axum Web 框架集成的工具,用于自动为您的所有端点生成 OpenAPI 描述。 我们要感谢 Juha Kukkonen 在这个工具上的出色工作!

支持表格和“举报 Crate”按钮

由于 crates.io 团队规模很小,而且主要由志愿者组成,我们没有能力手动监控所有发布。 相反,我们依靠您,Rust 社区,来帮助我们捕获恶意 crate 和用户。 为了让您更容易举报可疑的 crate,我们在所有 crate 页面上添加了一个“举报 Crate”按钮。 如果您遇到您认为恶意或违反 行为准则 或我们的 使用政策 的 crate,您现在可以单击“举报 Crate”按钮并填写出现的表格。 这会将电子邮件发送给 crates.io 团队,他们将审查该 crate 并在必要时采取适当的措施。 感谢 crates.io 团队成员 @eth3lbert 完成了这项工作的大部分内容。

如果您对支持表格或“举报 Crate”按钮有任何问题,请告诉我们。 如果您不想使用表格,您也可以随时直接发送电子邮件至 help@crates.io

发布通知

我们添加了一个新功能,允许您在发布 crate 的新版本时接收电子邮件通知。 这对于检测未经授权发布的 crate 或仅仅是为了跟踪团队其他成员的发布非常有用。

Publish Notification Screenshot

此功能是社区的另一个 长期以来的功能请求,我们很高兴最终实现了它。 如果您不想接收发布通知,则可以转到 crates.io 上的帐户设置并禁用这些通知。

其他

这些是过去几个月 crates.io 上一些更明显的变化,但“幕后”也发生了许多事情。

  • RFC #3691 已开放并被接受,以在 crates.io 上实施“受信任发布”支持,类似于其他采用它的生态系统。 这将允许您在 crates.io 上指定哪个存储库/系统可以发布您的 crate 的新版本,从而允许您从 CI 系统发布 crate,而无需再处理 API 令牌。

  • 与上述内容略有相关:在 crates.io 上创建的 API 令牌现在默认在 90 天后过期。 不过,仍然可以禁用过期或选择其他过期时长。

  • crates.io 团队是最早使用 diesel 数据库访问库的项目之一,但由于它仅支持同步执行,因此在我们的代码库中使用它有时会有点尴尬,因为在迁移到 axum 后,我们的代码库越来越多地转向异步方向。 diesel 的维护者 Georg Semmler 做了大量工作,使 diesel 可以在异步方式下使用,从而产生了 diesel-async 库。 在过去的几个月中,我们逐步将 crates.io 移植到 diesel-async 查询,这现在使我们能够利用 diesel-async 中的内部查询流水线,从而使我们的一些 API 端点获得了 10-15% 的性能提升。 感谢 Georg 在这些 crate 上的工作!

  • 每当您发布新版本或撤回/取消撤回现有版本时,都需要更新一些内容。 我们的内部数据库会立即更新,然后在后台 worker 作业中同步稀疏索引和 git 索引。 以前,撤回和取消撤回大量版本都会为每个版本排队另一个同步后台作业。 我们现在已经实现了冗余后台作业的自动去重,使我们的后台 worker 效率更高。

  • 刚刚在上周合并的最后一个重大内部更改与我们的前端代码测试有关。 过去,我们使用一个名为 Mirage 的工具来实现 API 的模拟版本,这使我们能够在无需启动完整的后端服务器的情况下运行前端测试套件。 不幸的是,Mirage 周围的维护情况最近迫使我们寻找替代方案,我们很高兴地报告,我们现在已完全迁移到“行业标准 API 模拟”包 msw。 如果您想了解更多信息,可以在“小型”迁移拉取请求中找到详细信息。

反馈

我们希望您喜欢这次关于 crates.io 开发的更新。 如果您有任何反馈或问题,请在 ZulipGitHub 上告诉我们。 我们总是很高兴收到您的来信,并期待您的反馈!