Rust : Trusted Publishing(受信发布)

原文

crates.io:开发进展 2025 年 7 月 11 日 · crates.io 团队

最近 crates.io 做了几件对开发者很实用的更新,核心看这几项:

  1. 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。
  • 官方文档:crates.io/docs/truste...

  1. 更"能打"的 OpenGraph 分享图
  • 以前:所有 crate 分享出去都是同一张图,信息量低。

  • 现在:每个 crate 都有自动生成的专属图片(发布新版本时会重新生成),包含:

    • crate 名称、关键词、描述
    • 默认展示的版本、总发布次数
    • 许可证、crate 体积
  • 场景:你把 crates.io 链接贴到微信群、Twitter、论坛,预览图会更"信息密集"。

  • 技术点:功能独立为 crates_io_og_image(开源),使用 Typst 做排版、oxipng 做压缩;还在给 docs.rs 做主题复用。

  1. 一键触发 docs.rs 重建
  • 解决的问题:文档构建失败,或想让旧版本文档享受 docs.rs 新功能,不想专门发一个无意义的小版本。
  • 现在:在 crates.io 的"版本列表"里可以直接点按钮触发该版本的 docs.rs 重建。
  1. README 支持 GitHub 风格"警示块"
  • 现在在 README 里写如下内容,会在 crates.io 上被正确渲染并带样式:

    • !NOTE

    • !WARNING

    • !CAUTION

  • 场景:在 README 里加"重要提示/注意/警告"更显眼,省去自定义 HTML/CSS 的麻烦。
  1. 一些"看不见但有感知"的底层优化
  • 邮件系统改为模板化(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 交流。团队很欢迎反馈。
相关推荐
Pomelo_刘金2 小时前
Rust :裸函数 naked functions
rust·嵌入式
猫头虎6 小时前
Rust评测案例:Rust、Java、Python、Go、C++ 实现五大排序算法的执行时间效率比较(基于 OnlineGDB 平台)
java·开发语言·c++·python·golang·rust·排序算法
ftpeak6 小时前
Rust 嵌入式开发的经验之谈
开发语言·后端·rust
已黑化的小白17 小时前
Rust 的所有权系统,是一场对“共享即混乱”的编程革命
开发语言·后端·rust
John_Rey17 小时前
Rust类型系统奇技淫巧:幽灵类型(PhantomData)——理解编译器与类型安全
前端·安全·rust
John_Rey1 天前
Rust底层深度探究:自定义分配器(Allocators)——控制内存分配的精妙艺术
开发语言·后端·rust
勤奋的小小尘1 天前
第三篇: Rust 结构体、Trait 和方法详解
rust
isyuah1 天前
Rust Miko 框架系列(二):快速上手与基础示例
后端·rust
isyuah1 天前
Rust Miko 框架系列(四):深入路由系统
后端·rust