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