根 package.json 里用 overrides 把 axios 锁到 1.6.8,装完 pnpm why axios 仍显示 1.4.0,子包 node_modules 里也是旧版本,请求日志里 UA 还带着 1.4.0。乍看像缓存或者权限的锅,追下去往往不是。
pnpm why axios pnpm install --force pnpm list axios -r --depth 1
追下去是这么回事:overrides 只对当前 package.json 所在的那棵依赖树生效,子包自己声明了 resolutions 或直接依赖时,根目录的覆盖不会向下传递。锁文件里已有的解析结果会被优先复用,改完没重新解析就还是旧版本。
「pnpm overrides 失效」这个问题文档写得含糊,实际行为以当前版本为准,别照旧版本的结论套。测试环境和线上的差别,往往就在版本号和那几行被忽略的配置上。
线上出问题先对时间点,跟发布、备份、任务执行的时刻排一排,能省掉一半功夫。日志级别临时调高可以,记得改回去,长期开着既占磁盘又掩盖真问题。
具体做法是,确认 overrides 写在 workspace 根目录的 package.json 而不是子包;删掉 pnpm-lock.yaml 重新 install 让解析结果重算;用 pnpm why 包名 看最终命中的版本从哪条依赖链来;子包里有自己的 resolutions 就统一挪到根部 只留一份。
验收就看一点,pnpm why 输出的版本变成 1.6.8 子包目录里不再有 1.4.0。
