精确版本与哈希
依赖固定始于锁文件:它记录每个包(直接与传递依赖)解析后的确切版本,以及下载产物的哈希。CI 使用 frozen-lockfile 模式安装,使解析器无法悄悄选择更新的版本。容器基础镜像应按 digest 固定,而不是使用可变 tag;CI action 应按提交 SHA 固定,而不是版本分支。
pnpm install --frozen-lockfile
docker pull node:22.11.0-bookworm-slim@sha256:0123456789abcdef
何时使用
任何交付给用户或在生产运行的项目都应固定依赖。当构建需要在数月后仍可复现、审计方追问运行的是哪份代码、或者生态刚发生域名抢注与维护者账号被攻破事件时,这一实践尤其重要。原型可以浮动版本,但一旦有部署,就需要锁文件。
权衡
固定用新鲜度换取确定性。安全补丁不再自动到达,团队需要自动化的升级 PR,以及让合并足够便宜的测试通道。定期的升级节奏可以避免版本长期停滞。手工固定传递依赖容易制造冲突;更稳妥的做法是让包管理器解析并提交锁文件。
示例与常见误解
某服务用 digest 固定所有镜像。当上游维护者账号被攻破并发布恶意补丁时,下一次构建仍安装已记录的产物,而升级机器人会把变更提交出来供评审。认为只有锁文件就足够的误解,忽略了安装参数与仓库信任。相关概念包括语义化版本、供应链安全与构建缓存。