Skip to content

Releases: Wonderow666/dsh-auto-update

v0.2.4 · 点了没反应修好了

Choose a tag to compare

@Wonderow666 Wonderow666 released this 22 Oct 06:00

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 · 中文目录也能用

Choose a tag to compare

@Wonderow666 Wonderow666 released this 22 Oct 04:29

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 · 默认安装目录不再误报

Choose a tag to compare

@Wonderow666 Wonderow666 released this 21 Oct 18:18

v0.2.2 · 默认安装目录不再误报

修复

  • 安装目录默认值(C:\Users\<用户名>\...)含中文用户名时,卡片之前会直接标红「这个路径含非 ASCII 字符」。这是误报:默认目录由 cmd.exe 在批处理里 %USERPROFILE% 展开,根本不经过 install-base.txt,当前安装一直是这么跑的。
  • 现在警告只针对你自己输入或选择的路径;默认目录改为显示一行说明("由 %USERPROFILE% 展开,不受 ASCII 限制")。
  • 「改到这里」「把当前安装迁过去」在草稿非 ASCII 或为空时直接禁用,不用等提交后才被服务端拒绝。

不变

  • 非 ASCII 的自定义路径仍然会被服务端拒绝(服务端校验未放宽),只是客户端提前告知。

v0.2.1 · 安装目录支持系统选目录

Choose a tag to compare

@Wonderow666 Wonderow666 released this 21 Oct 18:13

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 · 安装目录可改

Choose a tag to compare

@Wonderow666 Wonderow666 released this 21 Oct 18:04

新增:安装目录可改

设置页的「载具更新」卡片多了一个「安装目录」区块,可以把 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

Choose a tag to compare

@Wonderow666 Wonderow666 released this 21 Oct 17:31

DSH Web 的第一个公开自动更新插件。

能力

  • 设置页「载具更新」卡片:显示当前/最新版本,一键检查、安装、回滚
  • 旁路安装:新版本装到 dsh-install-<version>,与当前实例隔离,验证通过才切启动指针
  • 健康校验后切换:重启后必须确认监听正常且进程版本号匹配,否则判为失败
  • 失败自动回滚:起不来就把指针切回旧版本并重启,结果写入 last-result.json
  • 重启由 WMI 拉起的独立进程执行,父进程 WmiPrvSE.exe 不在宿主 job 树里,宿主死亡不会连坐
  • 升级器参数走 JSON 文件而不是 argv,子进程输出落盘,起不来会带着日志尾部报错而不是静默返回成功

已知限制

  • 0.2.1-rc.2 + dsh-vision-router 3.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「启动脚本契约」)。