配了多年 monorepo,今天 pnpm 把 dedupe 自动化了——CI 少跑一步,结果一样

npm/yarn/pnpm 三大包管理器,pnpm 最核心的优势是 dedupe——同一包的不同版本如果可以兼容,pnpm 会只存一份,不像 npm 那样每个项目都装一份。

这个优点一直需要手动触发。写到一个 monorepo 的 CI 流程里,就变成了:

- pnpm install --frozen-lockfile
- pnpm dedupe        ← 手动补这一步
- pnpm build

因为 frozen-lockfile 不改 lockfile,自动 dedupe 也不会被触发,所以必须在 lockfile 写入之后再单独跑一步。

这个痛点在大型 monorepo 里尤其明显——workspace 多了,同一包的兼容版本积累也快,每个月可能有几次 CI 跑出来的包结构和本地不一致,原因就是缺了这一步 dedupe。

pnpm 12.6(2026-09-22)把这个流程自动化了。

在 pnpm-workspace.yaml 加一行:

autoDedupe: true

之后每次 pnpm install,兼容版本的 dedupe 会在安装过程中自动完成,不再需要单独跑 pnpm dedupe。CI 流程简化为:

- pnpm install --frozen-lockfile
- pnpm build

frozen-lockfile 行为不变:lockfile 有变动时会报错,而不是静默更新,所以不会意外引入新版本的包。autoDedupe 影响的只是安装过程中 dedupe 的时机,不是 lockfile 的写入规则。

autoDedupe 也支持命令行单独开启:

pnpm install --auto-dedupe
pnpm add lodash --auto-dedupe

这个改动对 monorepo 的影响是:每千个包的仓库,CI 阶段少跑一次全量 dedupe,节省大约 30~90 秒(取决于依赖树深度),同时本地和 CI 的包结构完全一致,”本地正常但 CI 报错”的概率大幅下降。

下一步

如果你的 monorepo 仓库还没有加 autoDedupe: true,现在可以在 pnpm-workspace.yaml 里加上,然后跑一次 pnpm install 验证 lockfile 没有异常变化,再把 CI 里的 pnpm dedupe 步骤删掉。

评论区

0 条评论

登录后可评论。

铁锈·Rust工具链 15 阅读