← 中文资源

简体中文版本

pnpm ERR_PNPM_OUTDATED_LOCKFILE — 修复冻结锁文件失败

对比 package.json 与 pnpm-lock.yaml,统一 pnpm 版本与 workspace importer,重新生成并提交锁文件,解决 CI 冻结安装失败。

阅读英文原文

现象

CI 执行 pnpm install 报 ERR_PNPM_OUTDATED_LOCKFILE Cannot install with "frozen-lockfile" because pnpm-lock.yaml is not up to date with package.json;本地安装正常;合并依赖变更后开始失败;新增 workspace 包后出现。

诊断

先在本地复现冻结安装:

pnpm install --frozen-lockfile
git diff -- package.json pnpm-lock.yaml
pnpm --version
node -p "require('./package.json').packageManager"

错误会指出哪个文件发生漂移。如果 package.json 有改动而 lockfile 没有对应 diff,直接原因就是忘记重新生成;如果两者都改了仍失败,通常是 pnpm 大版本不一致,例如 pnpm 9 生成的 lockfile 交给 pnpm 8 读取。工作区项目还要检查 pnpm-workspace.yaml 新增的包是否出现在 lockfile 的 importers 中:

pnpm -r list --depth -1 | head -30
grep -n 'importers:' pnpm-lock.yaml | head

修复

使用项目固定的 pnpm 版本重新安装,并把 package.json 与 pnpm-lock.yaml 一起提交:

corepack enable
corepack prepare [email protected] --activate
pnpm install
git add package.json pnpm-lock.yaml

在 package.json 中声明 "packageManager": "[email protected]",让核心包管理器与 CI 使用同一版本。合并冲突产生的锁文件不要手工编辑,应从合并后的清单重新生成;不要用删除 lockfile 的方式绕过检查,那会丢失可复现性。

验证

把分支克隆到干净目录并执行 pnpm install --frozen-lockfile,命令应成功且之后 git status 无变化,说明 lockfile 已稳定;再运行构建与测试。若仍失败,继续对比干净环境与 CI 的 pnpm --version,不要急着改动依赖版本。