
ZTools打包与自动更新全链路electron-builder跨平台构建与Rust updater二进制实战【免费下载链接】ZToolsAn open-source implementation of uTools, a high-performance, scalable application launcher and plugin platform | Supports macOS and Windows, 一个高性能、可扩展的应用启动器和插件平台 uTools 的开源实现 | 支持 macOS 和 Windows项目地址: https://gitcode.com/gh_mirrors/ztool/ZToolsZTools 是一款开源的应用启动器与插件平台uTools 的开源实现支持 macOS 和 Windows。本文带你完整走一遍它的工程链路从electron-builder跨平台打包、构建产物瘦身到 Rust 编写的 updater 二进制与应用内自动更新理解一个生产级桌面应用是如何打完包、更得动的。为什么值得研究这条链路很多 Electron 项目能跑但发布环节经常踩坑安装包臃肿、更新失败、双架构合并麻烦。ZTools 的做法有几个亮点单文件构建配置所有平台差异收敛到一份 YAML签名前注入完整安装标记让更新器能识别旧版安装并引导迁移Rust updater 二进制macOS 双架构预编译随包分发更新元数据脚本化latest.yml/latest-mac.yml自动生成并校验。一键跨平台构建electron-builder 脚本ZTools 基于 Electron 41 electron-vite electron-builder 26。所有构建入口都收敛在 package.json 的scripts中脚本作用build:win构建 Windows NSIS 安装包 zipbuild:mac构建 macOS DMG zip签名公证build:mac:x64/build:mac:arm64分别构建 Intel / Apple Siliconbuild:linux构建 AppImage 与 debbuild:unpack仅解包不产安装包适合快速验证updater生成/合并更新元数据node scripts/updater.mjs每个脚本都用cross-env ZTOOLS_TARGET_PLATFORM...指定目标平台保证在任意 CI 机器上都能确定性地构建。一份 YAML 管住三个平台electron-builder.ymlelectron-builder.yml 是整个打包链路的核心关键配置一览全局瘦身files中显式排除src、tests、docs、scripts、internal-plugins、锁文件与 tsconfig 等开发文件排除node_modules里的.d.ts、openai 的src、lmdb 与 uiohook-napi 的源码目录避免源码混入产物asarUnpack只保留运行时必须解包的resources/**和sharp、img原生模块npmRebuild: false跳过原生模块重编译交给预编译产物显著缩短构建时间。Windows目标为nsisx64ziponeClick: falseallowToChangeInstallationDirectory: true给用户选择安装目录的自由createDesktopShortcut: always卸载时保留用户数据deleteAppDataOnUninstall: false。macOS目标为dmgzip开启notarize: true公证LSUIElement: true作为启动器常驻菜单栏不显示 Dock 图标声明相机/麦克风/文档/下载目录权限描述避免运行时权限弹窗歧义。其他fileAssociations注册了.zpxZTools 插件包关联双击即可安装插件afterPack: ./build/afterPack.js是产物最后一步的钩子下面细讲。afterPack 钩子签名前写入更新兼容标记build/afterPack.js 在 electron-builder 打完包、正式签名之前执行两件事写入完整安装标记ztools-install-info.json含appId: top.z-tools、Electron 版本、updater 类型electron-updater-mac/electron-updater-nsis。应用更新时靠它判断当前安装是否为标准完整安装否则如旧的绿色版会引导用户迁移一次完整版本避免签名与运行时状态不一致按平台架构清理无用原生资源扫描ia32、armv7l等不匹配的预编译模块并删除防止安装包背着一堆用不到的二进制。标记必须写进最终Contents/Resources且赶在签名前完成——这正是 afterPack 钩子存在的意义在 electron-builder 的标准化流程中插入一段项目自己的质量关卡。Rust updater 二进制macOS 更新的执行者仓库根目录的 updater/ 目录存放了两份预编译的 Rust 更新器updater/mac-amd64/ztools-updater约 2.8 MBIntelupdater/mac-arm64/ztools-updater约 2.7 MBApple Silicon用 Rust 而非 Node 脚本做更新器的好处很实际单文件、零运行时依赖、启动快、崩溃面小。它由 CI 交叉编译后以二进制形式进入仓库打包时按架构随包分发应用内更新流程直接调用它完成下载校验与替换。更新元数据latest.yml 与 latest-mac.yml应用内更新依赖latest 文件版本号 下载地址 SHA-512 校验。scripts/updater.mjs 负责在 CI 中合并生成Windows读取构建产出的latest.yml注入changelog.md的发布说明后写出macOS 双架构分别读取MAC_X64_UPDATE_METADATA与MAC_ARM64_UPDATE_METADATA两份元数据合并成一份latest-mac.yml同时包含 x64 与 arm64 的 ZIP 地址并通过validateReferencedAsset确认 YAML 引用的完整 ZIP 确实存在于构建产物中——元数据与实际产物不匹配时直接构建失败最后把各平台下载链接追加到 changelog.md一次发布文档与更新源同步就绪。开发模式下dev-app-update.yml 指向项目的 Release 源让未打包的pnpm dev也能走检查更新逻辑而不报错。应用内自动更新从心跳检查到静默替换运行时更新链路分为三层全部位于主进程调度层src/main/api/updater.tsUpdaterAPI注册updater:check-update、updater:start-update、updater:cancel-update、updater:install-downloaded-update等 IPC 通道更新检查由活动心跳统一调度handleHeartbeatUpdate并尊重用户在设置里的自动检查更新开关支持服务端下发的多下载渠道应用内渠道走标准更新器人工渠道则用系统浏览器打开且强制校验 HTTPS发现新版本后弹出一个 500×450 的无边框置顶更新窗口updater.html展示版本、发布说明与下载进度。标准更新器封装src/main/api/electronUpdater.tsElectronUpdaterService把electron-updater的autoUpdater封装成清晰的状态机idle → checking → available → downloading → downloaded → installing关闭后台静默安装autoDownload false下载与重启时机全部交给更新窗口用户可控、可取消CancellationToken中断下载后回到 available 状态优先差分下载失败回退完整包安装时 Windows 走 NSISinstallDirectorymacOS 交给 Squirrel 替换应用包。平台适配器src/main/api/platformUpdater/macos.ts初始化前先校验安装兼容性src/main/api/macInstallCompatibility.ts。旧版非签名安装不能直接进 Squirrel 流程会弹出一次性迁移提示引导用户装一次完整 DMG数据与插件全保留windows.tsNSIS 安装目录保留、覆盖安装逻辑disabled.ts不支持的平台直接降级为手动下载引导。这种接口不变、按平台替换实现的结构让更新窗口的 UI 与交互代码完全不用关心平台差异。测试如何兜底这条链路更新与构建相关的关键逻辑都有单测覆盖位于 tests/main/ 目录例如electronUpdater.test.ts状态机、差分下载、取消语义serverUpdateCatalog.test.ts、updateSource.test.ts服务端更新目录解析与下载渠道判定;updaterWindow.test.ts、macInstallCompatibility.test.ts、windowsInstallCompatibility.test.ts更新窗口与安装兼容性迁移。小结ZTools 的发布与更新链路可以概括为四步electron-builder.yml用一份配置管住 Win/mac/Linux 三平台产物与瘦身策略afterPack 钩子在签名前写入安装标记、清理无关二进制Rust updater 二进制updater/双架构预编译scripts/updater.mjs元数据合并保证更新源与执行者都可靠三层更新架构调度 → 标准更新器 → 平台适配器让应用内更新可取消、可迁移、跨平台行为一致。如果你想在自己项目中复刻这套实践建议从最小闭环开始先跑通latest.yml electron-updater再逐步加入 afterPack 标记、多架构元数据合并与安装兼容性迁移提示。相关源码可参考 docs/ 下的开发文档与上文列出的各模块文件。【免费下载链接】ZToolsAn open-source implementation of uTools, a high-performance, scalable application launcher and plugin platform | Supports macOS and Windows, 一个高性能、可扩展的应用启动器和插件平台 uTools 的开源实现 | 支持 macOS 和 Windows项目地址: https://gitcode.com/gh_mirrors/ztool/ZTools创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考