首页/开发/CI/CD 与发布速查/npm ci 与锁文件
构建与制品管理58 条

npm ci 与锁文件

npm ci 严格按 package-lock.json 安装(会先删除 node_modules):CI 中用于保证依赖可复现,快于 npm install。

CI/CD 与发布速查开发更新于 2026-10-13

npm ci 与锁文件是什么

package-lock.json 记录整棵依赖树的精确版本与完整性校验值(含间接依赖);npm ci 严格只读锁文件安装:先删除 node_modules 再全量安装,不解析、不更新锁文件,锁文件与 package.json 不一致时直接报错退出。CI 用它保证依赖可复现——同一提交在任何机器上装出同一棵树;本地开发用 npm install 做解析与升级。因为跳过了解析步骤,npm ci 通常也更快。yarn / pnpm 有对应机制(--frozen-lockfile / --immutable)表达同样语义。

基本信息

npm ci只读锁文件安装;锁文件与 package.json 不一致时报错
npm install可能更新锁文件并做依赖解析
规则锁文件必须提交进仓库,CI 用 ci 不用 install
兼容性锁文件有格式版本(lockfileVersion),跨 npm 大版本升级时留意

典型使用场景

  • CI 安装依赖:保证每个构建跑在与本地一致的依赖树上。
  • Docker 构建:构建镜像时用 npm ci 让镜像层可复现且更快。
  • 依赖升级评审:升级产生锁文件 diff,随 MR 一起评审,变更可见、可回滚。
  • 安全修复:公告触发升级后,锁文件 diff 明确标注受影响包的变化。
  • 故障复现:用同一提交与锁文件重建环境,排除依赖漂移干扰。

CI 建议流程

CI 建议流程
npm ci
npm test
# pnpm / yarn 的等价语义:
# pnpm install --frozen-lockfile
# yarn install --frozen-lockfile(yarn 1)/ --immutable(Berry)

ci 与 install 对比

维度npm cinpm install
锁文件只读,不修改可能更新
node_modules先删除再全量安装增量安装
一致性不一致即报错忽略差异并解析
适用CI、可复现构建本地开发
依赖升级应该产生锁文件 diff 并随 MR 评审:变更可见、可回滚,而不是让 CI 环境默默漂移。
切换 npm 源会改写锁文件里的 resolved URL:这不是依赖变更,评审 diff 时先排除这类噪声。
Docker 构建利用层缓存:先 COPY package*.json 再执行 npm ci,源码变动不会让依赖层缓存失效。
monorepo 的 workspaces 场景:锁文件在仓库根目录,子包各自维护锁文件会互相打架,统一在根目录安装。

易错点

  • CI 用 npm install:锁文件被悄悄改写,构建结果随仓库外状态漂移。
  • 锁文件与 package.json 不同步提交:npm ci 直接报错,本地先跑一次 ci 再提交。
  • 缓存 node_modules 加速 CI:绕过了锁文件校验且易漂移,应缓存 npm 缓存目录而不是 node_modules。
  • 团队 npm 版本不统一:不同 lockfileVersion 互相覆盖,用 engines 或 .nvmrc 统一 Node 版本。
  • 锁文件长期冻结不升级:已知漏洞与过时依赖持续累积,配合依赖机器人定期刷新。

数据来源与参考

  • npm Docs《npm ci》
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌