Skip to content

fix(install): run npm from Windows paths with spaces - #426

Merged
x-lixu merged 2 commits into
QwenAudio:mainfrom
kevin9327:fix-windows-npm-install-path
Sep 17, 2026
Merged

x-lixu merged 2 commits into
QwenAudio:mainfrom
kevin9327:fix-windows-npm-install-path

Conversation

@kevin9327

Copy link
Copy Markdown
Contributor

变更说明

现象:Windows 上 Node.js 安装在含空格的目录(官方安装包默认的 C:\Program Files\nodejs)时,qwenaudio install <后台> 与桌面版“安装”按钮的 npm 步骤立即失败:

安装命令执行失败(退出码 1):npm install -g opencode-ai@1.18.5
'C:\Program' 不是内部或外部命令,也不是可运行的程序或批处理文件。

原因findExecutable('npm.cmd') 返回完整路径 C:\Program Files\nodejs\npm.cmdrunStep 在 Windows 上以 shell: true 启动它。Node 只把命令与参数用空格拼接后交给 cmd.exe /d /s /c,未加引号的路径在第一个空格处被截断。同一文件里安装后查询 npm 全局前缀的 spawnSync(npmCommand, ['config', 'get', 'prefix']) 没有经过 shell,Node 会以 EINVAL 拒绝直接启动 .cmd,于是始终回退到 %USERPROFILE%\AppData\Roaming\npm,自定义 npm prefix 时装好的命令不会进入 PATH。

修复:仅在 Windows 且命令路径含空白、尚未加引号时为其加上双引号;前缀查询与安装步骤一致,经 shell 执行同一个带引号的命令。其他平台、无空格路径和 powershell.exe 脚本步骤的行为不变。

验证

本机 Windows 11,Node 24.17.0 / npm 11.13.0(与 CI 同为 Node 24 主版本)。

新增回归测试 runs npm.cmd from a Windows directory containing spaces:在临时目录的 Program Files\nodejs 下放置一个假的 npm.cmd,经真实 spawn 走完整个 installBackend('opencode'),并断言安装参数与 npm 前缀进入 PATH。非 Windows 平台跳过。

修复前(未改 install.mjs):

✖ runs npm.cmd from a Windows directory containing spaces
  AssertionError [ERR_ASSERTION]: {"code":"STEP_FAILED","message":"安装命令执行失败(退出码 1):npm install -g opencode-ai@1.18.5","exitCode":1,"cause":"[stderr] 'C:\\Users\\...\\qwen-audio-install-vzR5NI\\Program' ..."}

修复后:

  • node --test server/test/backend-install.test.mjs(26 通过)
  • npm test(2366 项,2347 通过,19 跳过,0 失败)
  • npm run lint
  • npm run build
  • 行为变化已补充测试

兼容性与安全

  • 未提交密钥、用户数据、日志或内部地址
  • 用户可见行为已更新 CHANGELOG;无配置或依赖变化
  • 进程管理:只改变 Windows 上传给 cmd.exe 的命令路径引号,参数与 PATH 处理不变,不引入新的 shell 调用路径;前缀查询从“必定 EINVAL”变为正常执行 npm config get prefix。无网络、权限或持久化影响。回滚:还原本 PR 即恢复原行为。

🤖 Generated with Claude Code

kevin9327 and others added 2 commits September 13, 2026 22:07
Quote the npm.cmd path before cmd.exe runs install steps, and query the
npm global prefix through the same shell so Node no longer rejects the
.cmd file with EINVAL.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

@x-lixu x-lixu left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

感谢修复 Windows 默认 Node 安装路径含空格时的一键安装问题,并补充真实 npm.cmd 回归测试。已同步最新 main;Windows Node 22/24、其他平台 CI、发布检查和移动端构建均通过,审查通过。

@x-lixu
x-lixu merged commit 18920da into QwenAudio:main Sep 17, 2026
11 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants