打包产物:便携版、dist 与安装器(WiX MSI)
SpinningMomo(旋转吧大喵)的发布链路由三类产物构成:xmake release 产出的便携版(免安装、直接在 build\windows\x64\release\ 运行的原生 Win32 C++ 可执行文件与内嵌 web 资源)、聚合到 dist/ 的分发目录,以及由 scripts/build-installer.js 驱动的 WiX MSI 安装包与 WiX Bundle setup.exe。本页梳理这三类产物的形态、构建入口、版本号来源与验证方式。
Purpose and Scope
本页覆盖:
- 便携版(Release 构建输出)的目录形态与"绿色运行"语义
dist/分发目录的内容构成(exe + web resources)- 安装器构建入口
node scripts/build-installer.js/pnpm run build:installer,以及 MSI 与 WiX Bundle 的关系 - 安装器脚本的命令行开关(
--msi-only、--version)与默认版本来源version.json - 产物与测试的关系(场景测试默认以 Release 产物为门禁)
本页不覆盖(留给兄弟页面):
- xmake 构建系统内部与自定义任务(
tasks/中的release、vs任务)的实现细节 —— 见构建系统相关页面 - Android 采集中间件
momo-capture.jar的打包(pnpm run build:android,产物在build\android\) docs/VitePress 文档站的构建 —— 它不属于运行时分发内容- 应用内的自动更新功能(
features/update)
Overview
SpinningMomo 是仅面向 Windows 的原生 Win32 C++ 应用,内嵌 WebView2 前端(Vue 3)。这一定位直接决定了它的打包形态:
- 便携版(Portable):
xmake release将可执行文件与资源直接产出到build\windows\x64\release\。仓库的场景测试明确将其描述为 "isolated portable sandboxes"(隔离的便携沙箱)中测试SpinningMomo.exe,说明 Release 产物本身就是免安装、可直接运行的绿色形态。 dist/分发目录:仓库记载Distribution: dist/ (exe + web resources),即分发时以"可执行文件 + web 前端资源"的组合交付。- 安装器(Installer):通过
node scripts/build-installer.js(或pnpm run build:installer)构建。脚本生成一个 MSI 安装包,并默认额外生成一个基于 WiX Bundle 的 setup.exe,两者都输出到dist/。WiX 源文件位于installer/目录。
版本号以仓库根部的 version.json 为默认来源,命令行 --version X.Y.Z 可覆盖之。
Architecture
下面的架构图依据 AGENTS.md 与 AGENTS.md 的 Build Output / Installer 章节 绘制。实线为 AGENTS.md 明确记载的数据流;虚线(.->)为合理推断(例如安装器脚本消费 Release 产物),其内部实现未在本页核实:
图中的关键分层含义:
- 构建层:
xmake release负责 C++ 后端的 Release 编译;pnpm run build:web单独构建前端。二者是独立入口,最终在分发层汇合。 - 安装器构建层:
scripts/build-installer.js是唯一的安装器编排入口,WiX 源文件集中在installer/(AGENTS.md 记载installer/为 "WiX source files for MSI and bundle installer generation")。 - 分发层:MSI、setup
.exe、以及 exe + web 资源统一落在dist/。 - 验证层:场景测试默认以
build/windows/x64/release/下的 Release 产物为被测对象。
Core Flow:从源码到安装器产物
依据 AGENTS.md 中记录的命令,一次完整的发布流程按以下顺序执行:
逐步说明:
xmake release—— 编译 C++ 后端的 Release 版本。便携版产物落在build\windows\x64\release\,Debug 版本则落在build\windows\x64\debug\(见 AGENTS.md Build Output)。pnpm run build:web—— 构建 web 前端。分发包中 "exe + web resources" 的 web 资源部分即来自这一步。node scripts/build-installer.js—— 安装器构建入口(也可用pnpm run build:installer)。该脚本:- 以
version.json为默认版本来源; - 生成 MSI 安装包;
- 默认额外生成基于 WiX Bundle 的 setup
.exe; - 两者均输出到
dist/。
- 以
Usage Examples
便携版构建命令
AGENTS.md "Build & Development" 章节记录的完整命令集(原样摘录):
1# C++ backend — debug
2xmake build
3
4# C++ backend — release
5xmake release
6
7# Web frontend
8pnpm run build:web
9
10# Android capture service
11pnpm run build:androidSource: AGENTS.md
其中 xmake release 是便携版/Release 产物的构建入口;xmake build 默认产出 Debug。
安装器构建(AGENTS.md 原文)
AGENTS.md 的 Installer 章节对安装器构建的完整描述(原样摘录):
1Installers are built via `node scripts/build-installer.js` (or `pnpm run build:installer`).
2The script builds an MSI package and, by default, a WiX bundle-based setup `.exe`,
3both under `dist/`. Use `--msi-only` to skip the bundle; use `--version X.Y.Z` to
4override `version.json`.Source: AGENTS.md
对应的调用形式:
1# 默认:MSI + WiX Bundle setup.exe,版本取自 version.json
2node scripts/build-installer.js
3
4# 或通过 pnpm
5pnpm run build:installer
6
7# 仅构建 MSI,跳过 Bundle
8node scripts/build-installer.js --msi-only
9
10# 覆盖 version.json 的版本号
11node scripts/build-installer.js --version 1.2.3Source: AGENTS.md(命令行形式由该段描述归纳而来;脚本源码
scripts/build-installer.js在本页未能读取,未核实内部实现)
场景测试中的便携沙箱用法
AGENTS.md Testing 章节展示了 Release 便携版在测试中的角色(节选自原文):
1They test a compiled `SpinningMomo.exe` in isolated portable sandboxes via JSON-RPC.
2The default gates the Release build (`build/windows/x64/release/`); content-hash
3semantics only hold in Release, so run `xmake release` before testing.
4Point at another build (e.g. Debug) via `--exe=<path>` / `SPINNING_MOMO_EXE`.Source: AGENTS.md
要点:场景测试默认门禁 Release 产物;内容哈希(content-hash)语义只在 Release 下成立,因此测试前必须先 xmake release;可用 --exe=<path> 或环境变量 SPINNING_MOMO_EXE 指向其他构建(如 Debug)。
Configuration Options
| 选项 | 类型 | 默认值 | 作用 |
|---|---|---|---|
--msi-only | CLI 开关(boolean) | 关闭 | 传给 scripts/build-installer.js 时跳过 WiX Bundle setup .exe 的生成,仅构建 MSI |
--version X.Y.Z | CLI 参数(string) | 取自 version.json | 覆盖安装器版本号,不修改 version.json 本身 |
version.json | 仓库文件 | 仓库当前值 | 安装器构建的默认版本号来源(文件内容未在本页核实) |
SPINNING_MOMO_EXE | 环境变量(string) | — | 场景测试中指定被测可执行文件路径,等价于 --exe=<path> |
--exe=<path> | 测试 CLI 参数(string) | build/windows/x64/release/ | 场景测试指向其他构建产物(如 Debug) |
Professional Notes
产物目录一览
| 产物 | 路径 | 生成入口 | 说明 |
|---|---|---|---|
| 便携版 Release | build\windows\x64\release\ | xmake release | 免安装可直接运行;场景测试默认门禁对象 |
| Debug 构建 | build\windows\x64\debug\ | xmake build | 开发调试用,不用于分发 |
| Android 中间件 | build\android\momo-capture.jar | pnpm run build:android | Android 采集中间件,见 android/capture/README.md |
| 分发内容 | dist/ | 构建流程汇聚 | "exe + web resources",以及安装器输出 |
| MSI 安装包 | dist/ | node scripts/build-installer.js | WiX 编译产出 |
| Bundle setup.exe | dist/ | node scripts/build-installer.js(默认开启) | WiX Bundle 驱动的安装器 |
Source: AGENTS.md
失败模式与边界情况(基于源码证据的部分)
- 测试前未跑 Release:AGENTS.md 明确 "content-hash semantics only hold in Release",如果直接对 Debug 构建运行场景测试,内容哈希语义不成立,可能导致测试结论不可信。缓解方式:先执行
xmake release。 - 测试与应用实例冲突:场景测试会启动一个编译好的
SpinningMomo.exe,AGENTS.md 要求 "Close any running application instance before testing",否则端口/资源占用可能干扰测试。 - 自动构建策略:仓库约定 "Do not run builds automatically; let the user confirm or run manually",即打包与构建命令需人工确认后执行,不应被脚本/代理自动触发。
设计意图(WHY)
- 便携优先,安装器其次:工具型桌面应用(围绕游戏窗口的截图/录制工作流)天然适合"解压即用"的分发形态;MSI/Bundle 则覆盖偏好正式安装的用户与企业场景。双形态分发由同一个脚本(
scripts/build-installer.js)统一编排,避免两套维护路径。 - MSI 与 Bundle 分离输出:MSI 是标准 Windows 安装单元,Bundle setup
.exe可封装引导与依赖;提供--msi-only让发布者在只需要 MSI(例如已有自有引导流程)时跳过 Bundle,减少构建时间与产物体积。 - 版本号集中在
version.json:让版本来源单点化,同时保留--version覆盖能力,便于 CI 或临时发布(例如候选版)不改仓库文件。 installer/与tasks/分离:AGENTS.md 将installer/(WiX 源)与tasks/(xmake 自定义任务如release、vs)列为独立仓库面,说明"安装器定义"与"构建任务编排"是刻意分离的关注点。
Extension Points
- 修改安装器行为:WiX 源文件集中在
installer/(MSI 与 Bundle 生成),调整安装界面、组件、升级逻辑应从这里入手。 - 调整发布/构建流程:
tasks/下的自定义 xmake 任务(release、vs)是构建编排的扩展点。 - 脚本源码未核实说明:
scripts/build-installer.js与installer/内的 WiX 文件在本页的资料收集预算内未能读取,其内部实现(例如如何定位 Release 产物、如何调用 WiX 工具链、--msi-only的具体分支逻辑)未在本页核实。如需深入,请直接阅读scripts/build-installer.js与installer/目录。
Tests
- 场景测试(TypeScript):位于
tests/scenarios/,通过pnpm run test:scenarios运行,在隔离的便携沙箱中以 JSON-RPC 方式驱动编译好的SpinningMomo.exe。它是对便携版产物最直接的端到端验证(见 AGENTS.md Testing)。 - C++ 单元测试:遗留 doctest 单元测试位于
tests/,经xmake test运行(同上来源)。
Related Links
- AGENTS.md — 仓库总览:构建命令、产物目录、安装器入口与测试策略
- android/capture/README.md — Android 采集中间件架构与打包说明
- docs/developer/architecture.md — 完整的环境搭建与构建步骤(AGENTS.md 指向的权威来源)
- 应用内更新机制的页面(
features/update相关)与 xmake 构建系统页面见本目录下的兄弟页面