清除 pnpm 缓存,解决不同源安装依赖包失败的问题
发现问题
问题的起因是 Github Actions 中的 CI 任务一直失败。
排查问题
查看具体的报错信息,发现 cnpm 镜像源(r2.cnpmjs.org)的 SSL 证书已过期,导致 pnpm 无法安全下载依赖包。
尝试修复
尝试在 CI 工作流中设置 pnpm 的安装源。在 GitHub Actions 中配置
- name: Install dependenciesrun: |pnpm config set registry https://registry.npmjs.orgpnpm install --frozen-lockfile
但仍旧出现报错,排查发现读取的 pnpm-lock.yaml 文件,这里的 tarball 直接指向了 r2.cnpmjs.org,导致 pnpm 仍然尝试从旧源下载(pnpm-lock.yaml 会锁定下载地址)
在本地环境设置 pnpm 的源地址
pnpm config set registry https://registry.npmjs.org/
手动删除 pnpm-lock.yaml 并重新安装依赖包,生成新的 pnpm-lock.yaml文件。对比旧的文件发现 tarball 的源地址未被修改。
怀疑是 pnpm 的缓存,导致未彻底更新。
修复问题
1. 在 .npmrc 中永久设置 registry
由于使用旧电脑安装过依赖包,导致生成了指向 cnpm 源的 pnpm-lock.yaml。因此在项目的根目录增加 .npmrc 文件,设置使用官方源,避免不同开发者/多设备开发时出现安装源地址不一致的问题。
registry=https://registry.npmjs.org/
2. 清理 pnpm 的缓存
如果之前安装过依赖,pnpm 可能会复用缓存(~/.pnpm-store),而缓存里的包仍然是旧源下载的。
执行以下命令清理缓存,重新安装依赖并生成新的 pnpm-lock.yaml
pnpm store prune # 清除缓存
rm -rf node_modules pnpm-lock.yaml
pnpm install # 重新安装
完成上面两步后,就可以解决问题了。欢呼🎉
后记:pnpm 源的优先级问题
pnpm 会按以下优先级读取配置:
- 项目级 .npmrc(项目根目录)
- 用户级 .npmrc(~/.npmrc)
- 全局 npm/pnpm 配置
如何检查
cat .npmrc # 查看项目级配置
cat ~/.npmrc # 查看用户级配置
pnpm config get registry # 查看全局配置
也可以检查 pnpm-lock.yaml 中是否锁定,如果 pnpm-lock.yaml 中锁定了特定 registry,pnpm 会优先使用它:
grep "r2.cnpmjs.org" pnpm-lock.yaml # 检查是否锁定了旧镜像源
grep "registry.npmmirror.com" pnpm-lock.yaml # 检查是否使用了阿里云镜像