Repository navigation
Releases: Wonderow666/dsh-auto-update
Release list
v0.2.4 · 点了没反应修好了
v0.2.4 · 「点了没反应」修好了
症状
点「把当前安装迁过去」,页面什么都不发生。
根因(两层)
第一层是它一直没告诉你失败在哪里:/migrate 和自动更新都要先拉起 apply-update.ps1,而插件当时用的是 node 的 detached: true。在这台机器上,这样拉起来的 powershell.exe 根本不执行——updater.log 里一个字节都没有,于是 API 只能回一句 updater failed to start and printed nothing。
第二层是不能简单改成普通子进程:普通子进程待在 web 宿主的 job 对象里,而 updater 干的第一件大事就是重启这个宿主——它会被自己触发的重启杀掉,日志会停在 stopped pid ... 那行。
改法
新增 start-updater.ps1:它作为普通子进程被拉起(能跑),只做一件事——用 Win32_Process.Create 创建真正的 updater(父进程变成 WmiPrvSE.exe,没有任何 job 覆盖它),打印 started pid=<n> 后退出。
插件也不再拿「spawn 返回了 pid」当「已经开工」:现在等三件事之一发生——update.log 增长、apply.lock 出现、updater.log 里出现 started pid=,宽限 20 秒(两次冷启动 + WMI 足够)。
证据
同一段命令、只改 spawn 选项的对照实验(子进程写标记文件):
| spawn 选项 | 子进程是否运行 |
|---|---|
detached: true(任意其余组合) |
否,零输出 |
detached: false |
是,exit 0,输出正常 |
去掉 windowsHide / -WindowStyle Hidden / stdio: 'ignore' |
仍然否 |
兼容性
接口不变,只多了一个随包发布的上游脚本(package.json 的 files 已包含)。v0.2.0 起的安装目录、回滚、自动更新行为都不变。
v0.2.3 · 中文目录也能用
v0.2.3 · 中文目录也能用
自定义安装目录不再要求纯 ASCII。E:\大鲸鱼老家 这种中文路径现在可以正常保存、迁移、启动。
为什么以前不行
install-base.txt 是给 cmd.exe 批处理读的一行文本。cmd 按控制台代码页解码文件内容,本机是 936(GBK):UTF-8 写进去的 大鲸鱼老家 会被按 936 解成乱码,于是 if exist "%BASE%\dsh-install-<版本>\...bin.js" 全部失败,启动器静默回退到默认目录——看起来像"设置没生效"。
怎么改的
- 启动器(
start-web.cmd与模板examples/start-dsh-web.cmd)在读取任何路径文件之前先chcp 65001,切到 UTF-8 代码页;之后再读install-base.txt就得到正确的字符。 install-base.txt的契约改为:一行 UTF-8 绝对路径(无 BOM、无换行),可含中文。文件内容仍然只有一行,改动前后格式兼容。- 设置卡:删除 ASCII 硬阻断。现在只有 Windows 本身禁止的字符(
" * ? < > |)、非法盘符、dsh-install-*目录本身会被拒绝;中文路径照常显示落点预览,"改到这里"和"把当前安装迁过去"两个按钮不再变灰。 - 服务端校验改为结构性检查(
lib/index.js的baseProblem(),apply-update.ps1的 migrate 分支同步放宽)。
升级提示
如果你自己另写了启动脚本(不是仓库里的 start-web.cmd),并且用中文目录,请确保在读取 install-base.txt 之前执行 chcp 65001 >nul。漏了这一行不会报错,只会静默找不到安装、回退到默认目录。
兼容性
- 不改变任何已有文件格式:仍是
install-base.txt一行路径、current-root.txt一行版本号。 - 纯 ASCII 路径的行为完全不变。
- 迁移流程(
robocopy→ 校验版本与--dump-config→ 改写指针与 base → 重启 → 失败同时回滚两者)不变。
验证
node test/handler.test.mjs(离线模式)全部通过,新增"非 ASCII 目录可写入并回读"用例。- 真实启动器 dry run:base 写成
E:\大鲸鱼老家时INSTALL_BASE与if exist判定均正确;把该版本的 junction 放进中文目录后ROOT=E:\大鲸鱼老家\dsh-install-0.2.0-rc.2正确解析。
v0.2.2 · 默认安装目录不再误报
v0.2.2 · 默认安装目录不再误报
修复
- 安装目录默认值(
C:\Users\<用户名>\...)含中文用户名时,卡片之前会直接标红「这个路径含非 ASCII 字符」。这是误报:默认目录由 cmd.exe 在批处理里%USERPROFILE%展开,根本不经过install-base.txt,当前安装一直是这么跑的。 - 现在警告只针对你自己输入或选择的路径;默认目录改为显示一行说明("由 %USERPROFILE% 展开,不受 ASCII 限制")。
- 「改到这里」「把当前安装迁过去」在草稿非 ASCII 或为空时直接禁用,不用等提交后才被服务端拒绝。
不变
- 非 ASCII 的自定义路径仍然会被服务端拒绝(服务端校验未放宽),只是客户端提前告知。
v0.2.1 · 安装目录支持系统选目录
v0.2.1 · 安装目录支持系统选目录
新增
- 设置卡「安装目录」新增 浏览… 按钮:走 DSH 自带的目录选择能力(
uiWorkspace.pickDirectory()),本机直连时弹出原生 Windows 文件夹对话框,选完直接回填输入框。 - 输入时实时预览落点:
将安装到 <目录>\dsh-install-<当前版本>,不用先提交也能看清会装到哪里。 - 路径里出现非 ASCII 字符时立即警告:启动器是 cmd.exe 脚本,按 OEM 码页读
install-base.txt,中文路径会变成乱码。
兼容性
uiWorkspace用ctx.get("uiWorkspace")可选获取,宿主没有这个服务时按钮自动隐藏、手输路径照常可用,不新增必填依赖。- 远程访问(非 loopback 绑定或 SSH)时,DSH 会切到浏览器端选择器,具体形态由宿主决定,插件只调用接口。
升级
插件以 Junction 链接装在 profile 里,重启宿主(start-web.cmd)后刷新页面即生效,不需要重装。
v0.2.0 · 安装目录可改
新增:安装目录可改
设置页的「载具更新」卡片多了一个「安装目录」区块,可以把 dsh-install-* 所在的盘从默认位置(%DSH_HOME% 的上一级)换到任意 ASCII 目录。
- 改到这里:只写
install-base.txt,之后的新版本装到新目录,正在跑的实例不动。 - 把当前安装迁过去:robocopy 复制 → 自检(版本 +
--dump-config冒烟)→ 写install-base.txt→ 切指针 → 重启 → 健康检查 + 版本核对。失败时指针和install-base.txt一起回滚(只回滚指针会指向新目录里不存在的版本)。 - 恢复默认位置:删掉
install-base.txt。
新接口:
| 方法 | 路径 | body |
|---|---|---|
| POST | /dsh-auto-update/api/install-base |
{"base":"D:\\dsh-installs"},"" 恢复默认 |
| POST | /dsh-auto-update/api/migrate |
同上(迁移当前安装并重启过去) |
启动脚本契约新增 <指针目录>\install-base.txt:一行 ASCII 绝对路径、无 BOM,不存在表示用默认目录。examples/start-dsh-web.cmd 已同步更新,并会在新目录与默认目录之间自动回退。
# 只打印计划,不复制、不改文件
powershell -NoProfile -ExecutionPolicy Bypass -File apply-update.ps1 -Mode migrate -Version 0.2.0-rc.2 -CurrentRoot C:\...\dsh-install-0.2.0-rc.2 -InstallBase D:\dsh-installs -DryRun限制:自定义目录必须是纯 ASCII 路径(cmd.exe 按 OEM 代码页读该文件);迁移是整目录复制,旧目录保留作回滚点。
0.2.1-rc.2 起仍受 dsh-vision-router 不兼容影响,本机实例继续停在 0.2.0-rc.2,详见 README 的「实战记录」。
v0.1.0
DSH Web 的第一个公开自动更新插件。
能力
- 设置页「载具更新」卡片:显示当前/最新版本,一键检查、安装、回滚
- 旁路安装:新版本装到
dsh-install-<version>,与当前实例隔离,验证通过才切启动指针 - 健康校验后切换:重启后必须确认监听正常且进程版本号匹配,否则判为失败
- 失败自动回滚:起不来就把指针切回旧版本并重启,结果写入
last-result.json - 重启由 WMI 拉起的独立进程执行,父进程
WmiPrvSE.exe不在宿主 job 树里,宿主死亡不会连坐 - 升级器参数走 JSON 文件而不是 argv,子进程输出落盘,起不来会带着日志尾部报错而不是静默返回成功
已知限制
- 0.2.1-rc.2 +
dsh-vision-router3.0.x 组合起不来(StartupError: 1 required plugin did not activate,connection等webRuntime),详见 README「实战记录」。维护者机器因此停在 0.2.0-rc.2 - 仅 Windows(重启链依赖 PowerShell + WMI)
安装
dsh plugin --profile web add github:Wonderow666/dsh-auto-update然后重启一次 web 宿主,并把 DSH_AUTO_UPDATE_LAUNCH_CMD 指向你的启动脚本(见 README「启动脚本契约」)。