pnpm 为什么分析依赖时显示的包和实际安装的不一致?

南宫丽苹 阅读 10

我用 pnpm 安装了一个包,但通过 pnpm why lodash 查看依赖关系时,发现它显示的版本和 node_modules 里实际链接的版本不一样,这是为啥?

我试过删掉 node_modules 和 pnpm-lock.yaml 重新 install,结果还是一样。是不是 pnpm 的依赖解析机制有什么特殊的地方?

我来解答 赞 2 收藏
二维码
手机扫码查看
2 条解答
设计师梦轩
pnpm 的 why 命令显示的是依赖图谱中该包被请求的版本路径,而不是最终实际安装的版本。这其实不是 bug,而是 pnpm 的设计行为。

举个例子:你执行 pnpm add lodash@4.17.21,但某个依赖间接依赖了 lodash@4.17.15。pnpm 会把这两个版本都安装进 node_modules/.pnpm,然后通过硬链接挂载到对应包里。这时候 pnpm why lodash 会列出两条路径:

- 一条是你显式安装的 4.17.21
- 一条是间接依赖请求的 4.17.15

它显示的是“谁在用”和“请求什么版本”,不是“最终用了哪个版本”。

真正实际链接到你项目里用的是哪个版本,可以看 node_modules/lodash/package.json 里的版本号,或者用 pnpm list lodash 看树结构——它会显示最终被 dedupe 后实际挂载的版本。

如果你发现 pnpm why 显示的版本和 node_modules/lodash/package.json 不一致,大概率是你项目里有多个依赖在请求不同版本,而 pnpm 没法完全 dedupe,所以生成了多个版本的链接。

可以优化成:
先跑 pnpm why lodash --depth 0 看顶层请求来源,再用 pnpm list lodash --depth 1 看实际安装树结构,对比一下就能搞清楚到底是依赖冲突还是只是展示逻辑让你误会了。

顺便说一句,pnpm 的 lockfile 里 specifiers 字段会记录每个包的请求版本,而 packages 里才是实际安装版本,两者本来就不该强一致。
点赞 2
2026-02-25 08:01
旗施🍀
我之前也遇到过这事儿,pnpm 的 why 命令显示的是依赖图谱里该包被请求的版本,不是最终实际安装的版本。实际安装的是 node_modules/.pnpm/ 里那个被 dedupe 后的版本。要查真实安装的版本,直接看 node_modules/lodash/package.json 里的 version,或者跑 pnpm list lodash
点赞 3
2026-02-24 22:02