概念
不随版本变化
依赖冲突:两个包都要同一个库
装完一个节点包,另一个坏了。这多半是依赖版本被互相覆盖了。
自定义节点包通常各自声明依赖。当两个包要求同一个库的不同版本时,后装的那个会把先装的覆盖掉,于是原来能用的功能坏掉。这就是依赖冲突。
冲突是怎么发生的
- 包 A 要求某库的新版本,包 B 只兼容旧版本,两者不能同时满足
- 安装工具默认按「最新满足条件」来解,装第二个包时可能把共享库升级或降级
- 有些包装的时候会连带替换计算相关的核心库,影响面比它自己大得多
- 升级主程序同样可能触发:主程序要求的核心库版本变了,旧节点包就跟不上
典型症状
- 装完某个包之后,另一个包开始报导入错误
- 启动时提示缺少某模块,或者提示某个符号找不到
- 程序能启动,但某个节点的功能报错,其它功能正常
- 回退一个包就好了,再装上又坏
怎么定位
- 看启动日志的扩展加载段:它会逐个报出哪个包导入失败、缺什么。这是最快的定位方式。
- 用最小化启动做二分:先禁用全部扩展确认基础功能正常,再逐个(或分批)启用,直到复现。
- 检查核心库版本:如果多个包都失败,先看计算相关核心库的版本是否被改动过。
- 记下改动前的版本组合:定位过程中每改一次就记一次,否则容易越修越乱。
怎么修
| 情况 | 处理 |
|---|---|
| 一个包版本旧了 | 把它升级到兼容当前核心库的版本 |
| 两个包确实互斥 | 只保留需要的那一个,或者找替代实现 |
| 核心库被换掉了 | 把核心库装回与主程序匹配的版本,并检查哪些包是被它带坏的 |
| 临时要同时用 | 把其中一个包放到隔离环境里跑,不要在同一套环境里硬凑 |
预防
- 装新节点包之前,先记下当前能用的版本组合
- 一次只装一个包,装完立刻启动一次确认没坏
- 优先选仍在维护、且明确支持你所用主程序版本的包
- 把「能用」的那套版本组合写进笔记
知仓学习社