pnpm-lock.yaml 是 pnpm 生成的锁文件,用于确保依赖版本的一致性。
锁文件结构:
yaml# pnpm-lock.yaml lockfileVersion: '6.0' settings: autoInstallPeers: true excludeLinksFromLock: false importers: .: dependencies: lodash: specifier: ^4.17.21 version: 4.17.21 packages: /lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LbbZUZt0P2vK6s4I6F7McA==} engines: {node: '>=6'} dev: false snapshots: lodash@4.17.21: {}
主要部分解析:
-
lockfileVersion
- 标识锁文件格式版本
- pnpm 8 使用版本 6.0
-
importers
- 记录每个包的直接依赖
- 包含 specifier(声明的版本范围)和 version(实际安装的版本)
-
packages
- 所有依赖包的元数据
- 包含解析地址、完整性校验、引擎要求等
-
snapshots
- 依赖树的快照
- 记录依赖关系
锁文件的作用:
bash# 开发者 A 安装依赖 pnpm install # 生成 pnpm-lock.yaml # 开发者 B 克隆项目 git clone project pnpm install # 根据锁文件安装,确保版本一致
版本控制:
bash# 必须提交到版本控制 git add pnpm-lock.yaml git commit -m "add lockfile" # CI/CD 中使用冻结安装 pnpm install --frozen-lockfile # 如果锁文件与 package.json 不匹配,安装失败
常见问题处理:
- 更新依赖
bash# 更新单个依赖 pnpm update lodash # 更新所有依赖 pnpm update # 更新到最新版本(忽略版本范围) pnpm update --latest
- 解决冲突
bash# 删除锁文件重新生成 rm pnpm-lock.yaml pnpm install
- 导入其他锁文件
bash# 从 package-lock.json 导入 pnpm import # 从 yarn.lock 导入 pnpm import
与 npm/yarn 锁文件对比:
| 特性 | pnpm-lock.yaml | package-lock.json | yarn.lock |
|---|---|---|---|
| 格式 | YAML | JSON | 自定义格式 |
| 可读性 | 高 | 中 | 低 |
| 存储方式 | 扁平化 | 扁平化 | 扁平化 |
| 硬链接支持 | ✅ | ❌ | ❌ |
最佳实践:
bash# 始终提交锁文件 git add pnpm-lock.yaml # CI 中使用冻结安装 pnpm install --frozen-lockfile # 定期更新依赖 pnpm update --interactive --latest