夜雨聆风学习资料网

ARTICLE · 1179185

AI 工具装了三份,怎样统一到最新版?

AI 工具装了三份,怎样统一到最新版?

我先说结论:"安装成功"这四个字,不能证明你正在用新版。

就在写这篇之前,我给这台 Mac 做了一次体检,目标是那个我天天用的命令行 AI 编程工具 opencode 。结果是这样的:

•~/.opencode/bin/opencode —— 1.18.35 ,排在 PATH 第一顺位
•/opt/homebrew/bin/opencode —— 2.0.25 ,包管理器装的
•/Applications/OpenCode.app —— 1.18.35 ,桌面版

我在终端敲下 opencode,跑起来的是 1.18.35,三份里最旧的那份。

没有报错,没有提醒,也没有任何一次安装失败。三次安装,每次都告诉我"已是最新"——它们说的都对,只是各自对着不同的通道说话。

这不是 opencode 独有的毛病。凡是"一个命令名 + 多条分发通道"的工具,都会有这一天:命令行一份、包管理器一份、桌面版一份,升级路径各走各的,最后谁在 PATH 前面谁说了算。

下面把这次的排查与统一过程完整记下来:三分钟怎么查、为什么会分裂、桌面版的自更新为什么永远升不上去、统一的正确顺序、要备份什么、哪些改动是破坏性的。

一、三分钟体检:你有几份,跑的是哪份

不用懂这些工具的源码,先跑这三条:

which-aopencode# 列出所有能找到的实例,顺序=解析顺序 opencode--version# 真正执行的那个是什么版本 ls-la"$(whichopencode)"# 它本身是不是软链接(包管理器装的会指向自己的目录)

看第一条就够了。which -a 的输出顺序就是系统解析顺序,第一条就是你的日常版本。我这台机器上,第一条是老安装脚本留在 ~/.opencode/bin 里的那份,第二条才是包管理器装的——按这个顺序,终端里的每一条命令都由第一份执行。

再加两条辅助判断:

brewlist--versions|grepopencode# 包管理器这份登记的是什么版本

桌面版则要看应用包本身,而不是关于窗口里那行字:

plutil-p/Applications/OpenCode.app/Contents/Info.plist|grep-iversion 

顺带一条经验:这类工具的老线与新线,版本号形态完全不同。老线打 1.18.35,新线打 v2.0.26。所以看到 1.x,说明你跑的是被淘汰的那条线,不管它看起来多新。

二、为什么会分裂:三条通道,三个"最新"

下面是这次核对出来的实况(版本与下载地址均为 2026-10-10 的核对结果;这类工具更新很快,你动手前请再核一次):

通道
官方线上版本
说明
GitHub Releases
v1.18.35 ( 2026-10-06 )
老线的最新发布,线上没有 v2 的发布包
npm 旧包名
1.18.35
老线仍在更新的包
桌面版安装包
1.18.35
下载地址指向同一个老线发布
官方新 npm 包
2.0.26
新线
官方 tap 公式
2.0.26
新线,且明确与老公式互斥:两者都提供同名命令
官方桌面安装包
2.0.26
新线

六个格子,三个"最新"。你要是按任意一条通道去查,得到的都是正确答案;三条合起来看,才会发现它们指向两个不兼容的大版本。

官方迁移文档里有一句话是这件事的关键:新旧两个大版本共用同一个命令名,并且官方不再让它们默认并行安装——装新版之前,要先把包管理器装的旧版移除掉。

换句话说,今天没有"装多了没关系"这个选项。同一个名字,谁在 PATH 前面谁就是"你的版本",而这往往取决于你一两年前写进 shell 配置里的某一行。

三、统一的操作顺序:先退后进,一次只留一份

原则只有一句:新的一份先立起来、验证能跑,再删旧的那份。

命令行:装到官方通道,卸掉包管理器那份

opencodeservicestop  mkdir-p~/.opencode/v1-backup cp-a~/.opencode/bin/opencode~/.opencode/v1-backup/opencode-1.18.35  curl-fsSLhttps://opencode.ai/v2/install|bash  brewuninstallopencode 

第 3 步为什么不直接 brew install 一个"最新版"就完事?因为包管理器的目录与官方安装脚本的落地目录不是同一个。这个工具的自升级走的也是官方安装脚本,而它的落地目录就是 ~/.opencode/bin——装在那里,以后升级不会再分裂;装到包管理器目录,就等于给自己留了下一次分裂的种子。

桌面版:自更新到不了新版,只能手工换

这里是整件事里最容易卡死的地方,也是我原来以为"等它自己更新就行"的错觉所在。

桌面版老版的更新配置写的是"从 GitHub Releases 取最新"。而新版桌面版根本没发布在 Releases 上——它只挂在官方的文件目录里。于是老版每次检查更新,问的都是一个永远只会回答"你就是最新"的地方。它永远升不上去,而且永远不会报错。

替换流程:

1.从官方下载页取安装包(稳定通道链接会跳转到带版本号的真实地址,用稳定的那条就好)
2.装之前先挂载校验:版本号、 bundle id (与旧版一致才能原地替换)、代码签名与公证状态
3.确认应用没有在运行,卸掉旧版——注意不要带上"连同用户数据一起清除"的选项
4.用 ditto 把新应用拷进 /Applications(别用普通复制,会丢掉签名相关属性)
5.启动一次,确认能正常打开
6.打开它包内的更新配置看一眼:新版的更新源已经指向官方自己的更新接口,此后的版本更新由应用自己完成

把第 2 步做扎实,后面就不用赌:版本号对得上、 bundle id 对得上、签名公证通过,才往下走。这三条任意一条不对,都停下来重新下载。

四、升级前要知道的三处破坏性改动

官方迁移文档列了三条,都是"改了就回不去"的那种:

•插件 API 换新:为老版本写的插件在新版里跑不起来,要重新适配
•服务端 API 与客户端契约变更:如果你有别的程序在调它的服务接口,要跟着改
•终端配置合并:从分层的 tui.json 合并成一个全局 cli.json,这一步官方会自动迁移

判断自己疼不疼,就看这三条有没有命中你的用法。我这台机器没挂插件、也没有终端配置文件,所以三条全躲过去了;配置目录、凭据、会话数据库都在原处,升级完直接可用。

如果你挂了插件,顺序要反过来:先确认插件有新版适配,再动主程序。

备份纪律,三句话:

•旧二进制单独留一份,能回退(我留在 ~/.opencode/v1-backup/,不在 PATH 上)
•先建新的、验证能跑,再删旧的
•卸载时不要顺手清用户数据

五、验收到这一步才算完

升级不是"命令跑完了",而是"这几项都对了":

•which -a <命令> 只剩一条路径,没有第二份在旁边等着
•--version 输出的是新线版本号(v2.0.x,不再是 1.18.x)
•凭据清单还在(登录状态没被重置)
•模型列表能正常列出
•跑一次最小任务,确认端到端能用
•桌面版启动正常,且数据目录里是升级后新写入的文件

我这台的验收结果:命令行与桌面版都是 2.0.26 ,五条凭据全部沿用,模型列表正常,冒烟任务返回预期结果,旧的命令行二进制安安静静躺在备份目录里。

六、我把这三条写成了固定规则

这次之后,我把教训固化成了三句话,写进了交给助手读的项目规则里——写下来,下一个来接手这台机器的助手就不用再踩一遍:

1.一个工具只留一个安装通道。 自升级走在哪个目录,就只用那个通道;不要再用包管理器在另一个目录装第二份。
2."安装成功"不等于"跑的是新版"。 每次升级完,先 which -a,再 --version,两句话的事。
3.把结论写进规则文件。 人记不住 PATH 的细节,工具下一轮会重新问一遍;写进文件,它就每次都按规则走。

回到开头那个问题:装了三份,不是手滑,是因为今天很多 AI 工具把"最新"分散在好几条通道上,每条通道说的都对,而你的系统只听 PATH 的。

所以真正该问的不是"这个工具怎么用",而是"我到底在跑哪一份"。这个问题交给助手去做一次体检,比自己记那些目录要靠谱得多。

你机器上有几个版本的 AI 工具?如果不确定,把 which -a 的结果发给我看看。

本文由 AI 辅助创作,作者进行了实测验证和编辑修改。

相关学习资料