上手· 04
执行与日志
三个阶段怎么跑、产出文件怎么找出来、日志面板为什么要自己解码 GBK,以及执行期间为什么不能切工程。
两种跑法
| 按钮 | 行为 |
|---|---|
| 全部执行 | 合并 → 加密 → 打包 顺序跑,过程中显示「正在执行 N / 3」 |
| 单独执行 | 只重跑某一行对应的阶段,其余不动 |
每一步都从落盘的工程文件读参数:点执行时 Rust 侧会先 save_project,再进流水线。
所以「界面上改了但还没保存」这件事不存在 —— 保存的权威在后端,不在那 600ms 的防抖里。
失败即停。某一步失败会保留完整日志并停下,后面的步骤不再执行:它们依赖前一步的产物, 拿半成品继续跑只会得到更难排查的错误。

产出文件是「找」出来的,不是猜的
打包出来的文件名由 Inno 的 OutputBaseFilename 决定,合并与加密则是原地覆盖主程序 ——
三条路径的产物形态完全不同。所以 SealPack 不猜文件名,而是:
- 执行前给输出目录拍一张快照(文件名 + 修改时间 + 大小);
- 执行后再拍一张;
- 只认「本次新产生」或「本次被改写」的文件,并且递归到子目录。
于是「产出文件」按钮点下去,定位的永远是这次真正生成的那一份。 清单里躺着的旧安装包不会被误认成新产物。
日志面板
外部工具的 stdout / stderr 逐行推送,面板里分行显示并标注来源:
- UTF-8 与 GBK 都要认。 子进程输出可能是 UTF-8,也可能是系统 ANSI 代码页 (简体中文 Windows 上是 GBK)。解码先试 UTF-8,失败再按 GBK 解 —— 否则日志里全是乱码。
- 超过 5000 行从最早的开始裁剪。 长时间构建不会把内存吃满。
- 口令会被打码。 命令行原样打进日志,其中可能带口令;唯一的出口按规则表遮掉
PASSWORD=/SNKEYPASS=/RENAMEPASSWORD=/KEYPASS=(大小写不敏感)。 - 面板是 live region,读屏软件能读到新行;但不会在每次追加时抢焦点。
执行期间不能切工程
跑起来之后,左侧工程列表会被禁用 —— 中途切换工程会让正在跑的阶段落到另一个目标上。
但这只是第一道防线:快捷键与程序化路径仍可能触发切换。所以 runStage / runAll
在入口就快照当前工程,之后每次写回(状态、产出、保存指示)都先校验 current.id 是否还是它。
校验不过就丢弃这次写回,而不是写到别人的工程上。
临时文件
每个工程的阶段临时文件写在 %APPDATA%\com.hmilyld.sealpack\work\<工程 id>\ 下,
程序启动时清理超过 24 小时的。异常退出(强杀、断电)可能留下临时文件,
而加密配置与打包脚本里含明文口令 —— 这就是为什么要定时清。