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 交流。团队很欢迎反馈。
相关推荐
木易 士心5 小时前
Go、Rust、Kotlin、Python 与 Java 从性能到生态,全面解读五大主流编程语言
java·golang·rust
badmonster06 小时前
AI ETL需要不同的原语:从构建CocoIndex中学到的Rust经验🦀
rust·aigc
Source.Liu9 小时前
【Chrono库】Chrono 本地时区模块解析(src/offset/local/mod.rs)
rust·time
干饭比赛第一名获得者10 小时前
🚀 终极指南:Mac M4 编译 Rust 至 Linux (AMD64)
后端·rust
未来之窗软件服务11 小时前
幽冥大陆(三十六)S18酒店门锁SDK rust语言——东方仙盟筑基期
开发语言·c++·rust·智能门锁·东方仙盟sdk·东方仙盟一体化
ALex_zry12 小时前
C语言底层编程与Rust的现代演进:内存管理、系统调用与零成本抽象
c语言·算法·rust
ALex_zry12 小时前
内核开发者的视角:C与Rust在系统编程中的哲学与实践
c语言·开发语言·rust
u***451613 小时前
Windows安装Rust环境(详细教程)
开发语言·windows·rust
星释13 小时前
Rust 练习册 101:字符串序列切片的艺术
开发语言·后端·rust
Source.Liu14 小时前
【Chrono库】Android和OpenHarmony系统绑定(src/offset/local/tz_data.rs)
rust·time