夜雨聆风学习资料网

ARTICLE · 1337440

装一个插件,它顺手把 22 个旧插件全打开了

装一个插件,它顺手把 22 个旧插件全打开了

九月二十号晚上,我在自己那台跑 AI 工作台的机器上装一个插件。功能很简单:把对话接到聊天软件里。命令敲完,终端回了一个字,装好了。

重启服务。网页打不开,进程起来又倒下。

第二天翻配置文件才看清发生了什么。装插件这条命令,顺手把「启动时加载哪些插件」的那张清单也改了:本来是 4 条,变成了 22 条。多出来的 18 个,是我几个月来装过、试过、后来手动关掉的旧插件。它们一直躺在磁盘上,从来没被启动。这次被集体写了回去,一起启动,一起崩。

问题不在那个新插件。问题在「装」这个动作本身会改配置,而且改的是最关键的那张清单。

先把话说清楚:装上了,和能用,是两件事

这类插件化的工具,包括我用的这个,配置一般都在同一个文件里。文件里有两个地方跟插件有关,作用完全不同。

一个是依赖列表,意思是「本机需要这些包」。包会被下载,会被解压到目录里。装完,这件事就结束了。

另一个是加载清单,写着「启动时按顺序装载哪些」。功能由这张清单决定。

两个地方差多远?我那台机器今天跑出来的数字:依赖列表里 23 条,加载清单里 7 条。7 条里还有 2 条是工具自己的基础层,真正属于第三方的只有 5 个。

差出来的那些包,在磁盘上占着位置,在插件列表里也能看见,名字、版本号、路径一应俱全。它们从来没被启动过。没有报错,没有提示,功能就是不出现。

为什么会漏掉一层:因为只有一层会喊

从「装」到「用」,中间其实有四层。每一层失效时,你看到的现象一模一样,能查的证据完全不同。

第一层,装没装。包在不在依赖列表里。这层最友好,缺了会直接报错,告诉你找不到。

第二层,在不在加载清单。这层最坑。装好了,列表里也有,功能没有,一句提示都不给。

第三层,版本对不对。包会声明自己要求宿主哪个版本范围。对不上时,工具会说「留在已安装状态,但启动时被拒绝」。这层会喊,只是喊的位置在插件命令的错误输出里,不在服务日志里。

第四层,配置有没有值。插件加载了,设置没跟上。功能在,行为不对:样式没生效、模型没换掉、开关是默认值。

这层有个具体的样子。升级之后,自定义样式突然不管用了,去翻配置文件,文件还在、条目也在,看起来一切正常。真正的情况是:新版把用户设置搬进了另一层配置,搬的时候只认得它自己那几个字段,剩下的留在旧文件的副本里。文件在、条目在,都不代表值进来了。

四层里,只有第一层和第三层会主动喊。第二层和第四层不会。日志干干净净,不是因为没问题,是因为压根没有代码去写这条日志。

一次装插件,清单从 4 条变成 22 条

我那个工位目录里留着几个配置备份,时间点和数字摆在一起,能看出这条曲线:

  • 八月十六日:依赖 20 条,加载 20 条。那时候是全量装载,什么都上。
  • 九月十一日装聊天桥:依赖 20 条,加载 4 条。手工砍到最小。
  • 九月十一日装审计插件:依赖 21 条,加载 5 条。
  • 九月二十日装新插件:依赖 22 条,加载 22 条。
  • 十月十五日装搜索插件:依赖 22 条,加载 6 条。
  • 今天:依赖 23 条,加载 7 条。

九月二十日那条的备份文件名,是我当时随手写的事故名:crashloop。它的存在本身就是结论:装插件这个动作,碰的是加载清单,碰的方式是把依赖列表全量写回去。

所以加插件不是加一条,是把整张清单重写一遍。这句话值得记住,因为它解释了一类看起来莫名其妙的故障:明明只动了一个包,为什么整个服务起不来了。

两个动作就能防住。加之前,复制一份配置,文件名带上日期。加之后,立刻把清单读一遍,确认条数没有暴涨。前后不到一分钟,能省掉一次半夜爬起来重启。

三个看起来很靠谱、其实证明不了什么的办法

第一个,看插件列表。它回答「装了什么」,不回答「启动了什么」。我这边 21 个包里只有 5 个第三方插件在跑,看列表会以为有 21 个功能活着。

第二个,看服务日志。第二层和第四层不写日志。没日志不等于没问题,这两层在设计上就是静的。

第三个,看进程和端口。服务活得好好的,功能可以全丢。进程健康跟功能可用,是两码事。

三个办法的共同毛病:只能证明「没崩」,不能证明「有效」。这也是为什么这类问题经常拖很久才发现:所有监控都是绿的,功能早就没了。

一份五步清单,照着走

功能不出现的时候,按这个顺序查,一步一个判据,不要跳。

第一步,看装没装。列出这个工位装了哪些插件。没有,就是安装问题,停在这里。

第二步,看它在不在加载清单。打开配置文件,找加载清单那个数组。在,往下走。不在,这就是结论,加进去再重启。

第三步,看版本门禁放不放。在上一步命令的错误输出里搜 incompatible 这个词。有,就是版本对不上。要么换插件版本,要么按工具给出的方式做显式豁免。

第四步,看条目状态。现在的工具都能导出一份组合后的完整配置。在导出的内容里搜这个插件的条目名,看它有没有被禁用、禁用的条件在当前系统上是真是假。

有个坑要提醒:同一个插件名会在导出的配置里出现好几次,基础层一次、每个预设各一次。我这边一个命令行工具出现了 4 次,第一次是明确禁用,后面三次带的是「当系统是 Windows 时禁用」。如果在 Linux 上只看了第一处,结论会完全反过来。

第五步,看配置有没有值。同一个条目往下找配置块。该有而没有,就是值没进来。判据不是「文件在不在」,而是「这个条目下面有没有那块值」。补上之后重启,再导出一次配置核对,别只信界面上的开关。

最后

这套四层链路,不只适用于我用的这个工具。凡是「主程序 + 插件」结构的软件,从编辑器到构建工具,都有类似的层次:声明、加载、版本、配置。搞清楚哪一层在管什么,排查就从猜变成了查。

有一点判断标准是我这次才想明白的:工具说「装好了」,不能当证据;组合之后真正生效的配置,才能当证据。

觉得有用点个关注。想免费进星球的,公众号后台回复「星球」,我把链接回给你。微信上回消息的就是我,可能慢一点。

回首页,搜索你想要的文档

在首页搜索框输入关键词,快速定位资料

文库首页搜索指引 立即搜索

相关学习资料