npm/yarn/pnpm切换Nexus仓库源时如何避免重复下载包?
我在公司项目里用Nexus搭建了私有npm仓库,平时用npm config set registry切换内外网源。但发现每次切换回公共仓库后,之前通过Nexus下载的包还会重复下载,缓存好像没起作用。试过删除node_modules和缓存文件,但依然卡在下载阶段报404 Not Found错误:
npm ERR! 404 Not Found - GET https://registry.npmjs.org/lodash@^4.17.21
npm ERR! 404
npm ERR! 404 'lodash@^4.17.21' is not in the npm registry.
换yarn和pnpm也出现类似问题,搞不懂是仓库配置还是缓存机制的问题,有没有什么统一的解决方案?
首先确认你的Nexus私有仓库配置了正确的uplink,确保它能代理到官方源。如果私有源没配好代理,切换回公共源时就会出现找不到包的问题。
然后重点来了,你需要统一缓存路径来避免重复下载。对npm、yarn和pnpm分别设置环境变量或配置:
对于npm,可以设置
npm config set cache指定一个全局缓存目录,比如~/.npm-cache,然后通过npm config set registry切换源时缓存就能复用。yarn的话稍微麻烦点,需要在
.yarnrc文件里加上--mutex network和--cache-folder配置,指定一个固定的全局缓存路径。pnpm也有类似的机制,可以通过
pnpm config set store-dir设置一个全局的store目录,保证不同源的包都能共享同一个存储位置。最后一个小技巧,如果你经常需要切换源,可以写个简单的脚本来同时切换registry和缓存路径,省得每次都手动设置。比如用shell写个函数:
这样每次切换源的时候,缓存路径也会跟着一起切换,能有效避免重复下载的问题。记得根据实际情况调整路径和域名。