npm命令下的registry不work
有时因为网络或安全问题,需要切换项目中的npm包源。一般做法是切换npmrc中源,但切换后进行安装包时,会发现install后,包还是会走老的源,尤其是lock文件已生成的情况。这里就分析下registry不work的问题。
版本信息
这里我使用如下版本来做验证。
npm v9.5.1
node v18.16.1
当前lock文件信息
翻看lock文件,以@babel/plugin-proposal-private-property-in-object
包为例,会发现lock文件中直接记录了对应包版本下的地址,这里为https://registry.npmjs.org/
npmrc
尝试使用npmrc文件配置源来进行更新,配置如下。
1 | registry=https://registry.npmmirror.com |
实际测试,执行npm i 并不会从新的源地址下载包。
install –registry
既然rc配置源不行,尝试直接npm install –registry进行源覆盖。
1 | npm i @babel/plugin-proposal-private-property-in-object --registry=https://registry.npmmirror.com |
实际测试执行安装包命令,--registry
是可以进行覆盖安装。
直接安装全部包呢?
npm i –registry=https://registry.npmmirror.com
测试发现并没有变化。
删除lock文件呢
删除lock文件的前提下,重新npm install,会发现还是缓存包
删除node_modules
重新npm install,会发现包的resolved并不是走的npmrc的配置。
删除node_modules,lock文件后,执行install –registry
发现所有的包下载地址均是https://registry.npmmirror.com。此时安装新包,比如`npm install antd`。发现不需要手动设定registry,即会走npmrc中配置的源。
结论
通过上述的测试,明白了npm安装包时,对于registry的优先级处理是下面这样:
- 命令参数
--registry
- lock文件中resolved/缓存中
- npmrc或缺省registry
基于这个优先级,那么当实际项目中我们需要改变包源,那么对于存量的包,我们要么删除node_modules,package-lock.json,重新执行安包,要么就需要手动编辑lock文件,直接替换所有的registry地址了。个人觉得后者更佳,毕竟可以不影响包版本。