记一次 opencode 版本更新:从 1.15.1 到 1.15.3
2026-05-17
起因
用户反馈:「opencode 最新版本是 1.15.3,当前版本不对」。
先确认现状:
$ opencode --version
1.15.1
确实落后两个小版本,但事情远没有「npm install -g 一下」那么简单。
第一步:npm install -g opencode?
直觉是 npm 全局安装包名就是 opencode:
$ npm install -g opencode@latest
npm error 404 Not Found - GET https://registry.npmjs.org/opencode - Not found
npm registry 上根本没有叫 opencode 的包。那当前的 opencode 命令是哪来的?
第二步:找到真正的包
$ which opencode
/usr/local/bin/opencode
$ file /usr/local/bin/opencode
symbolic link to ../lib/node_modules/opencode-ai/bin/opencode.exe
真相大白:opencode 是一个预编译的 ELF 二进制,通过 npm 包 opencode-ai 分发。npm 上真正发布的是 opencode-ai。
$ npm search opencode
@opencode-ai/sdk — The official TypeScript library for the Opencode API (v1.15.3)
opencode-ai — 包含 opencode CLI 二进制的主包第三步:二进制是怎么来的?
查看 opencode-ai 的 package.json,发现 optionalDependencies 里列出了各个平台的预编译包:
{
"optionalDependencies": {
"opencode-linux-x64": "1.15.1",
"opencode-darwin-arm64": "1.15.1",
"opencode-windows-x64": "1.15.1"
}
}
安装流程是:
- npm 安装
opencode-ai(主包只包含 LICENSE + 479 字节的占位符 +postinstall.mjs) postinstall.mjs根据当前系统架构(linux-x64 / darwin-arm64 等)选择对应的平台包- 通过
npm install --ignore-scripts --no-save下载真正的 ELF 二进制 - 复制到
bin/opencode.exe
postinstall 脚本还会检测 CPU 是否支持 AVX2、libc 类型(musl vs glibc),选择最优的基线版本。
第四步:升级遭遇缓存坑
$ sudo npm install -g opencode-ai@1.15.3
changed 5 packages in 12s
$ cat /usr/local/lib/node_modules/opencode-ai/package.json | grep version
"version": "1.15.1"
npm 说安装成功了,但 package.json 里的版本号依然是 1.15.1。怀疑 npm 缓存污染,清理后重试:
$ sudo rm -rf /usr/local/lib/node_modules/opencode-ai
$ sudo npm cache clean --force
$ sudo npm install -g opencode-ai@1.15.3
这次 npm 把包安装到了 /usr/lib/node_modules/opencode-ai/(注意是 /usr/lib 而非 /usr/local/lib)。验证通过:
$ opencode --version
1.15.3技术总结
| 项目 | 说明 |
|---|---|
| CLI 命令 | opencode |
| npm 包名 | opencode-ai(不是 opencode) |
| 二进制形式 | 预编译 ELF,通过 postinstall 下载平台特定包 |
| 平台包格式 | opencode-{os}-{arch},如 opencode-linux-x64 |
| 关键机制 | postinstall.mjs 检测 CPU 特性(AVX2)、libc 类型(musl/glibc)选择基线版本 |
| 本次收获 | npm 全局包的缓存清理 + 多路径安装位置问题 |
这次更新虽然只是升了两个小版本,但暴露了 opencode-ai 这套「npm 壳 + 预编译二进制」分发的工程细节。下次遇到类似情况,先查 npm pack --dry-run 看 tarball 里到底有什么,能省不少时间。