opencode Windows 排错:解决 LSP 启动失败与 ENOENT uv_spawn 报错
本文总阅读量次

在上一篇里,我好不容易搞定了 opencode 在 Windows 上的的安装和 export 报错,正准备大展拳脚之时,LSP 又抛出了一个相当底层的错误:
⚙ lsp_diagnostics [filePath=...]
Error: ENOENT: no such file or directory, uv_spawn 'typescript-language-server'
ENOENT 通常意味着找不到文件。但我明明已经通过 npm 全局安装了包,终端里也能正常运行,为什么 opencode 偏偏说找不到?
原因分析:Windows 下 spawn 调用的后缀陷阱
我不信邪,翻了一下插件源码,在 lsp 启动逻辑[1]里找到了这段:
// ...
// 关键点:使用 bun x 启动服务
const proc = spawn(BunProc.which(), ["x", "typescript-language-server", "--stdio"], {
// ...
})
问题还是出在 Windows 上。
当你运行 npm install -g 时,npm 在全局目录生成的其实是三个文件:一个是 Shell 脚本(Windows 无法执行),一个是 .cmd,一个是 .ps1。
在终端敲命令时,Shell 会“聪明”地自动补全后缀并运行 .cmd 文件。但代码底层调用的 spawn 没这么智能——它只会呆板地去执行参数里指定的字符串。代码写的是 typescript-language-server(无后缀),Windows 内核去找这个文件发现不存在(因为它实际上叫 .cmd),于是直接报错。
解决方案:在配置中显式添加 .cmd
既然自动识别失效,我们就手动把后缀补上。在配置文件 oh-my-opencode.json 里显式加上 .cmd,帮它定位文件:
{
"lsp": {
"typescript-language-server": {
"command": [
"typescript-language-server.cmd",
" --stdio"
],
"extensions": [".ts", ".tsx"]
}
}
}
觉得 TS Server 太占内存的话,直接在配置里把它 disabled 掉也是个办法,眼不见心不烦:
{
"lsp": {
"typescript-language-server": {
"disabled": true
}
}