release-plz 驱动的 Rust 工作区发布流水线:OpenLogi 版本管理全流程拆解

发布时间:2026/8/30 10:05:09
release-plz 驱动的 Rust 工作区发布流水线:OpenLogi 版本管理全流程拆解 release-plz 驱动的 Rust 工作区发布流水线OpenLogi 版本管理全流程拆解【免费下载链接】OpenLogi⚡️A native, local-first alternative to Logitech Options, written in Rust — remap buttons, DPI, and SmartShift over HID. No account, no telemetry.项目地址: https://gitcode.com/GitHub_Trending/op/OpenLogiOpenLogi 是一个用 Rust 编写的本地优先local-first罗技外设管理工具作为 Logitech Options 的开源替代重映射按键、调节 DPI 与 SmartShift无需账号、无遥测。这篇文章拆解它的 Rust 工作区发布流水线——如何用 release-plz 统一管理 19 个 crate 的版本号、自动生成发布 PR、用 git-cliff 生成变更日志再到打 tag 触发签名打包与多渠道发布。 先看全景19 个 crate一个版本号打开根目录的 Cargo.toml你会发现一个关键设计工作区包含 19 个成员 crateHID 协议、设备驱动、GUI、Agent、CLI 等见 Cargo.toml所有 crate 共享一个版本号[workspace.package]下声明version 0.8.1各 crate 通过version.workspace true继承这意味着整个项目同进同退——发版时只改一处所有 crate 一起升版本、一起打一个v{version}tag。对新手来说这是多 crate 项目最省心的一种版本模型。整条流水线可以用一张图概括push master ──▶ release-plz 自动开 PR升版本 预览 │ 合并 chore: release PR │ release jobxtask 校验 ──▶ 打 v0.9.0 tag │ release.yml编译 ──▶ 签名公证 ──▶ 校验和 ──▶ 发布 │ GitHub Release 更新通道 latest.json homebrew-tap⚙️ 配置核心release-plz.toml 如何把版本锁在一起一切从根目录的 release-plz.toml 开始。核心配置只有三点却回答了多 crate 发布最常见的三个难题1️⃣version_group强制版本同步在 release-plz.toml 中11 个要发布到 crates.io 的 crateopenlogi、openlogi-core、openlogi-hidpp、openlogi-cli等都归入version_group openlogi。这样它们永远联动升级避免A crate 依赖的 B crate 还没发布这种地狱场景。2️⃣release false应用 crate 不参与发版release-plz.toml 里openlogi-desktopGUI、openlogi-agent托盘后台、openlogi-overlay等 6 个应用型crate 被标记为不发布——OpenLogi 以安装程序形态交付不是给人cargo install的 API 库。3️⃣ 职责切分谁管 tag、谁管 Release、谁管 CHANGELOG这是最容易踩坑的地方配置文件头部的注释写得很直白职责归属原因升版本号release-plz它的看家本领打v*tagrelease-plz仅openlogi根 crate一个 tag 代表整个工作区GitHub Releaserelease.yml的 softprops若 release-plz 先建 Release后续上传资产时会遇到 release immutable 错误CHANGELOG.mdgit-cliffrelease-plz 按 crate 路径过滤看不到不发布的应用 crate无法覆盖全仓库另外几个细节值得新手注意semver_check falserelease-plz.toml 里禁用了 semver 破坏性检查——应用项目不需要在发布 PR 里看API breaking噪音release_always falserelease-plz.toml 确保只有发布 PR 合并时才发版master 上后续的提交绝不会误切 tag 第一棒push master 自动打开发布 PR工作流 .github/workflows/release-plz.yml 监听 master 的每次 push运行release-plz release-pr从release-plz/前缀的分支打开一个 PR内容是各 crate 的版本号 bump 按 crate 的变更预览通过 1Password 中的本地 Action 铸造 GitHub App token.github/workflows/release-plz.yml因为 GITHUB_TOKEN 推送无法触发下游工作流亮点动作PR 打开后流水线会用git cliff为这个即将发布的版本写入整库 CHANGELOG然后直接把发布 PR 的正文替换成这份 changelog见 release-plz.yml。也就是说评审发布 PR 阅读版本说明合并 PR 确认发版流程非常直觉。 CHANGELOG.md 为什么交给 git-cliff.config/cliff.toml 定义了 changelog 生成规则只认 Conventional Commitsfeat→ Added、fix→ Fixed、perf→ Changedcliff.toml覆盖全仓库不按 crate 路径过滤——GUI 的改动同样进 changelog#123自动转换为 PR 链接xtask 中对应的命令是 xtask/src/commands/release/changelog.rs它以最近一个vX.Y.Ztag 为下界运行git cliff且每次重跑都会先删除旧的同版本段落保证发布 PR 反复更新时结果幂等。️ 第二棒合并前的三道 xtask 保险发布 PR 合并后触发条件苛刻的releasejob 才会执行仅当提交信息以chore: release开头或手动 dispatch见 release-plz.yml。它先运行两个 xtask 子命令全部定义在 xtask/src/commands/release.rs①checkout-version-bump把发布钉死在正确的 commit 上checkout_version_bump.rs 会先按提交信息chore: release v0.9.0查找升版提交找不到再回退到首次把 Cargo.toml 改成该版本的提交然后强制检出到它。目的绝不让比升版提交更新的 master 尖端被发版——如果 crates.io 发布失败你可以修好凭据后在同一 SHA 上重试而不是切出一个错误的版本。若该版本已打过 tag直接输出skiptrue跳过。②check-publish发布闭包校验check_publish.rs 解析cargo metadata确保每个可发布 crate 对内部 path 依赖都声明了 registry 版本号req *直接报错可发布 crate 不能依赖未发布的内部 crate这正是 release-plz.toml 中openlogi-camera必须留在版本组里的原因crates.io 上的包无法依赖未发布的路径依赖。️ 第三棒tag 触发 release.yml签名、校验、发布一条龙release-plz 打完v*tag 后接力棒交给 .github/workflows/release.yml它由四个 job 组成build复用同一构建矩阵为 macOS / Windows / Linux 编译安装程序sign: true启用签名与公证macOS DMG 是发布门禁。release-notes用 Node 脚本生成 GitHub Release 说明generate.ts仅 tag 运行时执行。publish真正的发布中枢注意它的门禁条件release.yml——只要求macOS 腿成功Windows/Linux 腿尽力而为。这样实验性的 arm64 Windows 构建失败不会拖垮 macOS 发布。具体步骤生成SHA256SUMS校验和DMG 缺失则大声失败用 minisign 对所有产物生成.minisig分离签名并回验运行cargo run -p xtask -- release latest-json生成静态更新清单 latest.json供 gpui-updater 消费产物上传 R2版本目录 channels/stable/latest.json更新通道最后一步才用 softprops 创建 draft → 上传全部资产 → 转正式规避 immutable release 陷阱release.ymlhomebrew-tap向 Homebrew tap 仓库发送update-openlogi事件让brew install openlogi自动跟进新版本。✅ 清单这套流水线值得抄的设计 给维护多 crate Rust 项目的朋友OpenLogi 的做法浓缩为 6 条单版本号 version_group工作区同进同退一个 tag 代表一次发版发布 PR 即 changeloggit-cliff 全库视角合并 PR 审批发版职责单一化release-plz 只管升版本和打 tagRelease 生命周期交给专门工作流发布钉在升版 commit失败可在同一 SHA 安全重试发布闭包前置校验在打 tag 前发现依赖了未发布 crate的硬失败门禁分级核心平台是硬门禁实验性平台降级为尽力而为绝不让旁路拖垮主发布完整细节可继续阅读仓库文档 docs/DEVELOPMENT.md 与 xtask/README.md或直接在 release-plz.toml 中查看每行配置的注释——那是本文信息量最密集的一处活文档。【免费下载链接】OpenLogi⚡️A native, local-first alternative to Logitech Options, written in Rust — remap buttons, DPI, and SmartShift over HID. No account, no telemetry.项目地址: https://gitcode.com/GitHub_Trending/op/OpenLogi创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考