乐闻世界logo
搜索文章和话题

pnpm 的全局 store 是什么?如何管理和清理?

3月6日 21:35

pnpm 的全局 store 是其核心特性之一,用于存储所有项目的依赖包。

Store 位置:

bash
# 默认位置 ~/.pnpm-store # Windows %LOCALAPPDATA%/pnpm/store # 自定义位置 # .npmrc store-dir = /path/to/custom/store

Store 结构:

shell
~/.pnpm-store/ ├── v3/ # store 版本 │ ├── files/ # 实际文件存储 │ │ ├── 00/ # 基于内容寻址的目录 │ │ │ ├── abc123... # 文件内容 │ │ │ └── def456... │ │ └── ... │ └── index/ # 索引文件 │ └── ... └── metadata.json # 元数据

内容寻址存储:

pnpm 使用内容寻址(Content-Addressable Storage):

javascript
// 文件存储路径基于内容 hash const crypto = require('crypto'); const content = fs.readFileSync('lodash.js'); const hash = crypto .createHash('sha256') .update(content) .digest('hex'); // 存储路径: ~/.pnpm-store/v3/files/00/abc123...

Store 管理:

bash
# 查看 store 信息 pnpm store status # 查看 store 路径 pnpm store path # 清理未使用的包 pnpm store prune # 验证 store 完整性 pnpm store verify

Store 的优势:

  1. 磁盘空间节省
bash
# 10个项目使用 lodash@4.17.21 # npm: 10 × 1.4MB = 14MB # pnpm: 1 × 1.4MB = 1.4MB
  1. 安装速度提升
bash
# 首次安装 pnpm install lodash # 下载到 store,创建硬链接 # 第二个项目安装 pnpm install lodash # 直接从 store 创建硬链接,秒级完成
  1. 跨项目共享
bash
# 项目 A cd project-a pnpm install # 下载到 store # 项目 B cd project-b pnpm install # 复用 store 中的包

Store 清理策略:

bash
# 清理未引用的包 pnpm store prune # 什么时候需要清理: # 1. 升级 pnpm 版本后 # 2. 磁盘空间不足时 # 3. 长时间未清理时

多 Store 配置:

bash
# 不同项目使用不同 store # project-a/.npmrc store-dir = /path/to/store-a # project-b/.npmrc store-dir = /path/to/store-b

Store 与硬链接的关系:

shell
全局 Store: ~/.pnpm-store/v3/files/00/abc123 (实际文件) 项目中的硬链接: project-a/node_modules/.pnpm/lodash@4.17.21/lodash.js → abc123 project-b/node_modules/.pnpm/lodash@4.17.21/lodash.js → abc123 project-c/node_modules/.pnpm/lodash@4.17.21/lodash.js → abc123 # 所有硬链接指向同一个物理文件

注意事项:

  1. 跨文件系统问题
bash
# 硬链接不能跨文件系统 # 如果项目在不同分区,需要配置 store 位置 # .npmrc store-dir = /same/filesystem/path
  1. 权限问题
bash
# 确保 store 目录有正确权限 chmod -R 755 ~/.pnpm-store
标签:PNPM