crates.io:开发进展 2025 年 7 月 11 日 · crates.io 团队
最近 crates.io 做了几件对开发者很实用的更新,核心看这几项:
- Trusted Publishing(受信发布):不再在 CI 里存放发布密钥
-
解决的问题:以前用 GitHub Actions 发布到 crates.io,要在仓库里配置长期有效的 API Token(有泄漏风险、也不好轮换)。
-
现在怎么做:在 crates.io 上把你的 GitHub 仓库设为"受信任"。发布时,GitHub Actions 通过 OIDC 临时换取一个短期 token,用完就失效,不用你自己管理长效密钥。
-
现状与前置:目前支持 GitHub Actions;未来可能支持其他 CI(如 GitLab CI)。首次发布仍需要手动,之后可切换为受信发布。
-
上手步骤(简化):
-
第一次用 cargo publish 手动发版。
-
在 crates.io 的你的 crate 页面里绑定受信仓库。
-
GitHub Actions 配置:
- 给 workflow 开 id-token: write 权限。
- 使用 rust-lang/crates-io-auth-action@v1 获取临时 token。
- 用获取的 token 执行 cargo publish。
-
- 更"能打"的 OpenGraph 分享图
-
以前:所有 crate 分享出去都是同一张图,信息量低。
-
现在:每个 crate 都有自动生成的专属图片(发布新版本时会重新生成),包含:
- crate 名称、关键词、描述
- 默认展示的版本、总发布次数
- 许可证、crate 体积
-
场景:你把 crates.io 链接贴到微信群、Twitter、论坛,预览图会更"信息密集"。
-
技术点:功能独立为 crates_io_og_image(开源),使用 Typst 做排版、oxipng 做压缩;还在给 docs.rs 做主题复用。
- 一键触发 docs.rs 重建
- 解决的问题:文档构建失败,或想让旧版本文档享受 docs.rs 新功能,不想专门发一个无意义的小版本。
- 现在:在 crates.io 的"版本列表"里可以直接点按钮触发该版本的 docs.rs 重建。
- README 支持 GitHub 风格"警示块"
-
现在在 README 里写如下内容,会在 crates.io 上被正确渲染并带样式:
-
!NOTE
-
!WARNING
-
!CAUTION
-

- 场景:在 README 里加"重要提示/注意/警告"更显眼,省去自定义 HTML/CSS 的麻烦。
- 一些"看不见但有感知"的底层优化
-
邮件系统改为模板化(minijinja):
- 以前用字符串拼接,难维护且风格不统一。
- 现在改为模板引擎,支持模板继承,后续也更容易支持 HTML 邮件。
-
语义化版本(SemVer)排序下推到数据库:
- 以前 API 服务器把所有版本拉出来再排序,版本一多就慢。
- 现在利用 PostgreSQL 的 JSONB 和 btree 规则在数据库侧排序,API 服务器压力更小,响应更快。
该关心哪一项?
- 有持续发布需求、且用 GitHub Actions:优先关注"受信发布"(安全性与易用性大幅提升)。
- 想让分享更像"产品卡片":OpenGraph 新图提升链接传播视觉效果。
- 文档偶尔构建失败或想拿到 docs.rs 新特性:直接在 crates.io 触发重建即可。
- README 常写"注意/警告":用 GitHub 风格警示块更清晰。
- 维护超多版本的热门 crate:数据库侧 SemVer 排序会让接口更快、更稳。
给一个最小可用的受信发布 workflow 模板
-
前提:在 crates.io 绑定你的 GitHub 仓库;本仓库首发已手动完成一次。
-
workflow 核心要点:
- 触发条件:推送以 v 开头的 tag(比如 v1.2.3)
- 权限:id-token: write(OIDC 必需)
- 用 crates-io-auth-action 取临时 token,传给 cargo publish
示例(可直接用,按需改 tag 规则):
yaml
name: Publish to crates.io
on:
push:
tags: ['v*'] # 推送以 v 开头的 tag 时触发
jobs:
publish:
runs-on: ubuntu-latest
environment: release # 可选:环境保护
permissions:
id-token: write # OIDC 交换所需
steps:
- uses: actions/checkout@v4
- uses: rust-lang/crates-io-auth-action@v1
id: auth
- run: cargo publish
env:
CARGO_REGISTRY_TOKEN: ${{ steps.auth.outputs.token }}
在哪里反馈?
- 有建议或问题,可以到 Zulip 或 GitHub 交流。团队很欢迎反馈。