概述
在 package.json 中固定直接依赖并不会固定传递依赖,只有锁文件记录了完整解析结果。冻结安装会在 package.json 与锁文件不一致时直接失败,这正是发布分支需要的行为:绝不静默解析出未经测试的版本。
步骤
- CI 严格按锁文件安装:
pnpm install --frozen-lockfile
# npm 等价命令
npm ci
- 在发布窗口内暂停自动化依赖 PR。Renovate 可用如下规则:
{
"packageRules": [
{
"description": "Release freeze 2026-10-21 through 2026-10-28",
"matchPackageNames": ["*"],
"enabled": false
}
]
}
- 在发布流水线中检查锁文件未变化:
git diff --exit-code pnpm-lock.yaml。 - 发布结束后移除冻结规则,逐个小批量合并升级,每次合并后运行完整测试。
验证
预期发布构建期间锁文件差异为零,产物摘要与发布说明中记录的一致。若 --frozen-lockfile 失败,说明锁文件不同步,应显式运行 pnpm install --lockfile-only、审查差异并作为发布准备单独提交,而不是在流水线中自动修复。
注意事项
- 冻结会延迟安全补丁,窗口应控制在数天而非数周。
- 锁文件不覆盖基础镜像、系统包和运行时解析的对等依赖,镜像应使用摘要而非可变标签。
- 冻结期间出现严重 CVE 时,走有记录的安全例外流程:只升级该包、完整回归后再恢复冻结。
- 现有自动化分支不要强制推送,避免丢失评审记录。