首页 / 资讯中心 / 文章详情

下载管理器如何一次点击升级 6 个平台:Rayburst 发布与自动更新机制完整指南

下载管理器如何一次点击升级 6 个平台:Rayburst 发布与自动更新机制完整指南 ★ FEATURED ARTICLE
下载管理器如何一次点击升级 6 个平台Rayburst 发布与自动更新机制完整指南【免费下载链接】rayburstRedefining the open-source download manager项目地址: https://gitcode.com/gh_mirrors/mo/rayburst下次当你在 Rayburst 里盯着一条任务的速度曲线时顺手点下检查更新有一件事可能不太符合直觉更新包正在下载而下载引擎本身还在照常跑你的任务一秒都没停。这个基于 Tauri 2 Rust Vue 3 重写的下载管理器把更新拆成了检查、下载、安装三个各自独立的动作直到最后一步才短暂停掉内置的 Aria2 Next 引擎。更反直觉的是它的更新入口是个永久地址——客户端从未请求过任何带版本号的 URL它永远去同一个叫updater的固定 Release 里取latest.json或beta.json取到哪个渠道、装哪个版本全靠标签名和一份可随时覆盖的清单决定。本文不沿着打标签→跑 CI→收安装包的时间线讲而是反过来先给你一张全链路速览图再挑三个最值得抄的设计决策拆开看。先给地图一条更新链路涉及的六个角色角色住在哪一句话职责版本号src-tauri/Cargo.toml唯一事实来源package.json与Cargo.lock由脚本同步不手改发布开关scripts/release.sh本地先跑完整质量门禁全绿才提交、打vX.Y.Z标签并推送构建矩阵.github/workflows/release.yml在release: published事件后并行构建 6 平台注入签名私钥生成.sig渠道清单.github/scripts/refresh-updater-json.sh按标签名产出latest.json或beta.json覆盖上传到固定updaterRelease更新运行时src-tauri/src/commands/updater.rs渠道选择、可取消下载、两阶段安装、签名校验的 Rust 侧核心前端状态机src/composables/useUpdateFlow.ts更新对话框的按钮文案、可关闭性、进度换算全部纯函数记住这张表后下面三个深挖都可以对号入座。深挖一把更新入口钉死在一个永久地址上它解决什么。桌面应用的自动更新有个天然矛盾用户所在渠道stable 还是 beta会变化发布频率也会变化但客户端代码里的更新端点最好永远不用变。端点一变老版本就得重新分发渠道切换就变成了一次版本升级。怎么落地。CI 侧由refresh-updater-json.sh负责先校验标签名形如v主.次.补丁再按规则分流——标签含-beta/-alpha/-rc就生成beta.json否则生成latest.json。它会逐个确认全部 10 个平台产物macOSapp.tar.gz×2、Windows NSIS ×2、Linux AppImage / deb / rpm ×6和对应.sig签名都存在缺一个就中止然后用jq组装出包含版本号、发布说明、发布时间和 10 组下载 URL 签名的 JSON最后上传到一个名为updater的固定 Release 上不存在就先建并用--clobber覆盖旧文件。客户端侧updater.rs 里的UPDATER_BASE_URL指向这个永久地址plugins.updater.pubkey内置在 tauri.conf.json 中更新包必须通过 Ed25519 签名校验校验器发现公钥没配置时直接拒绝工作。为什么这么做、有何取舍。这份清单是指向最新版的指针不是版本历史回退版本不是回退 JSON而是重新发布旧标签。配套的纪律是标签 不可变指针——构建失败时修完代码要删掉远端标签、删掉 Release、再走一遍发布而不是往旧标签上补东西。另一个值得注意的细节release.yml的merge-updater-json任务在SIGNPATH_ENABLED开启时会主动让位把发布渠道 JSON 的权力移交给 Windows 签名工作流保证先装 Authenticode 签名、再签发 updater 签名、最后才动渠道清单这个顺序不被并发破坏。深挖二用 5 种 Runner 装下 6 个构建目标它解决什么。macOS 双架构、Windows 双架构、Linux 双架构共 6 个目标其中 Windows ARM64 在 x86 Runner 上没有原生工具链Linux ARM64 则根本没有现成云 Runner 可选。怎么落地。release.yml 用matrix.include声明 6 行任务但实际只占用 5 种 Runnermacos-26和macos-26-intel各建一个 macOS 架构Windows x64 与 ARM64 两个任务挤在同一台windows-2025-vs2026上ARM64 那个靠rustup target add交叉编译——注释里写明理由是NSIS 与架构无关Linux 则是ubuntu-22.04加ubuntu-22.04-arm。矩阵设了fail-fast: false一个架构挂了不连累其余五路。构建时注入TAURI_SIGNING_PRIVATE_KEY每个产物都产出一个.sig。矩阵里还藏着几个很工程的细节预发布版的 RPM 会被单独打包一次因为 RPM 的release编号规则与 App 版本号冲突rpm-version.sh先算出版本、tauri bundle单独再打一遍并用tauri signer sign --app-version补签名Windows 产物会被grep检查 import 表里不得出现vcruntime140之类的动态链接符号——安装包会临时目录里直接运行 exe用户机器不一定装了 VC 运行库Linux 的 AppImage 通过LINUXDEPLOY_EXCLUDED_LIBRARIES排除libwayland-*注释说明自带一份会在新版 Mesa 上弄坏 EGL、窗口打不开#714。取舍在哪。交叉编译省掉一台 Windows ARM Runner代价是构建顺序里多一步rustup target addupdate-homebrew任务则只在 stable 正式版且HOMEBREW_ENABLED开启时运行用brew bump-cask-pr --write-only自动更新 cask把发布即同步包管理器做成无感动作代价是它必须排在全矩阵构建之后。深挖三更新流程如何给正在跑的任务让路它解决什么。对一个下载管理器来说最糟糕的更新体验是点了更新下载全停。Windows 上还有个硬约束NSIS 无法覆盖正在运行的 exe所以安装前必须停引擎——问题是停引擎的时机应尽量晚。怎么落地。整个流程被拆进四个 Tauri 命令check_for_update(channel, proxy)只做元数据探测给 15 秒超时、走UpdaterBuilder的按请求代理而非改环境变量download_update(version)下载字节流期间 Aria2 Next 引擎不中断用户任务无感进度通过update-progress事件实时推给前端并且用tokio::select!把下载 Future 和一个Notify取消信号做竞速cancel_update一触发就退出apply_update才进入两阶段——先通过EngineSupervisor停掉引擎注释写明是为了让 NSIS 能覆盖、并防止会话文件损坏再执行安装如果安装失败还会调用ensure_running把引擎救活避免更新失败导致应用残废。护栏同样具体download_update要求传入的版本号必须与最近一次检查结果一致不一致就提示重新检查每次检查会递增一个 generation 计数结果返回前发现已被更新的检查取代直接返回冲突错误。签名层面build_updater发现公钥缺失会直接报错字节流验签失败则归入下载或签名校验失败。为什么这么做。下载与安装解耦后更新从一次阻塞操作变成了三段可随时介入的状态检查、下载可取消、安装需确认。前端在 useUpdateFlow.ts 里把这映射成一个七相位状态机checking / up-to-date / available / downloading / ready / installing / error每个相位对应明确的按钮文案、按钮类型和对话框能否关闭规则——downloading与installing期间禁止关闭error相位给出重试。渠道策略也在这里体现用户偏好存为updateChannelstable或beta且 beta 构建默认落在 beta 渠道选stable时只查latest.json选beta时会并发查两条渠道再用 SemVer 的cmp_precedence挑真正更新的那个——单元测试里就断言了stable3.8.8对阵 beta3.8.8-beta.4时选 stable避免 beta 用户被同版本号的预发布版反复升级。给想读源码的人20 分钟阅读路径想动手把这套机制过一遍按这个顺序走约 20~30 分钟git clone https://gitcode.com/gh_mirrors/mo/rayburstscripts/release.sh5 分钟——发布的起点。重点看它跑完哪一串门禁ESLint、format:check、vue-tsc、Vitest、cargo fmt --check、clippy -D warnings、cargo test后才允许提交、打注解标签并推送以及末尾按标签名判定 STABLE / PRE-RELEASE 的几行.github/workflows/release.yml5 分钟——看matrix.include的 6 行、Windows ARM64 交叉编译那一步、签名私钥的注入位置以及merge-updater-json任务上那句SignPath 启用时让位的条件.github/scripts/refresh-updater-json.sh5 分钟——渠道 JSON 的完整生产链标签校验 → 逐资产/签名核对 →jq组装 → 覆盖上传固定 Releasesrc-tauri/src/commands/updater.rs8 分钟——核心中的核心candidate_channels_for_policy的双渠道选择、select_latest_candidate的 SemVer 比较、tokio::select!竞速取消、apply_update的两阶段与引擎恢复文件末尾的单元测试基本把渠道选择逻辑全测了一遍值得连读src/composables/useUpdateFlow.ts3 分钟——看后端命令如何被前端状态机消费纯函数化让每个相位的行为都能单测。顺带一提scripts/bump-version.sh 虽然只有几行但版本号只从Cargo.toml出发、原子同步到package.json和Cargo.lock这条纪律是整条链路能自动化的地基。三条可以搬走的经验发布的入口是脚本和标签不是人手。质量门禁在打标签前本地完整跑一遍CI 只做最终形态版本号单一来源杜绝前端显示 1.4.0、后端还是 1.3.9这类漂移。渠道 固定地址 可覆盖清单。客户端端点永不变渠道由标签名决定清单每次发布覆盖——更新入口因此可以比应用本身活得更久。更新流程要为业务让路。下载、安装解耦引擎只在安装瞬间停摆且失败有恢复路径。对一个以持续下载为存在意义的应用这条比任何签名细节都优先。回到开头那个场景你在 Rayburst 里点下的那次检查更新背后其实是固定地址上的渠道 JSON、六个并行的签名构建、以及一段敢于在任务运行时下载、只在最后一刻才停引擎的三段式流程。小体积、快更新、强校验这套 release updater 组合拳对任何 Tauri 桌面项目都是可以直接对号入座的答案。【免费下载链接】rayburstRedefining the open-source download manager项目地址: https://gitcode.com/gh_mirrors/mo/rayburst创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
阅读完成 · 觉得有帮助?
咨询建站