opencode Windows 排错:解决 LSP 启动失败与 ENOENT uv_spawn 报错


本文总阅读量

opencode-windows-lsp-enoent-fix.png


在上一篇里,我好不容易搞定了 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
    }
}

  1. opencode 加载 lsp 逻辑 ↩︎


本站总访问量