npm命令下的registry不work

有时因为网络或安全问题,需要切换项目中的npm包源。一般做法是切换npmrc中源,但切换后进行安装包时,会发现install后,包还是会走老的源,尤其是lock文件已生成的情况。这里就分析下registry不work的问题。

https://static.1991421.cn/2024/2024-09-17-153822.jpeg

版本信息

这里我使用如下版本来做验证。

  • npm v9.5.1

  • node v18.16.1

当前lock文件信息

https://static.1991421.cn/2024/2024-09-17-153847.jpeg

翻看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的优先级处理是下面这样:

  1. 命令参数--registry
  2. lock文件中resolved/缓存中
  3. npmrc或缺省registry

基于这个优先级,那么当实际项目中我们需要改变包源,那么对于存量的包,我们要么删除node_modules,package-lock.json,重新执行安包,要么就需要手动编辑lock文件,直接替换所有的registry地址了。个人觉得后者更佳,毕竟可以不影响包版本。

相关资料