npm指定依赖包私有源问题记录

5,763 阅读3分钟

这是我参与「掘金日新计划 · 4 月更文挑战」的第 6 天,点击查看活动详情

设置源的问题

事情是这样的,我有一个项目,直接依赖了私包A,私包A对应的私仓地址是私仓A';又依赖了公开包B,B又依赖了私包C,私包C对应的私仓地址是私仓C'。因此我一共有三个npm源需要使用,一个是全局的npm/cnpm源,还有项目直接依赖包的私仓A',以及项目间接依赖的私仓B'。

我将项目下的.npmrc设为:

registry=https://registry.npm.taobao.org/
A:registry=A'
C:registry=C'

发现只对项目的直接依赖A:registry=A'生效,而对间接依赖C:registry=C'不生效。

最终无奈🤷🏻‍♀️之下,只能暂时将私包C发在了npm。也许获取npm的依赖图,然后再安装之前替换间接依赖的私仓地址可行?但权宜之计是发在npm处理了。

cnpm的问题

其实一开始使用的是cnpm,但是.npmrc对cnpm完全无效,它根本不会去读取这个文件。它自己有一个.cnpmrc的配置,但是必须在系统根目录下,当前根目录设置是无效的,多么鸡肋,怎么可能每次去系统根目录下设置呢?

npm源设置优先级顺序(从高到低)

项目级别配置:xx项目的根目录下的.npmrc文件 用户级别配置:

windows下 C:\Users\yourname\ .npmrc mac下 ~/.npmrc

全局级别配置:

windows下 C:\Users\yourname\AppData\Roaming\npm\etc\npmrc mac下 /etc/npmrc

npm install的执行过程

  1. 检查并获取 npm 配置,优先级为:项目根目录下的 .npmrc 文件 > 用户根目录下的 .npmrc 文件 > 系统根目录下的 .npmrc 文件 > npm 内置的 .npmrc 文件。

  2. 检查项目中是否有 package-lock.json 文件。如果有,则检查 package-lock.json 和 package.json 声明的依赖是否一致:

    2.1 一致,则直接 package-lock.json 中的信息,从缓存或网络资源中加载依赖;

    2.2 不一致,按照 npm 版本进行处理,查看不同版本的包是否规范一直,若一直则按照package-lock.json为准,若不一致则以package.json的版本下载(不同版本的npm策略略有不同)。

  3. 如果没有,则根据 package.json 递归构建依赖树。然后按照构建好的依赖树下载完整的依赖资源,在下载时就会检查是否存在相关资源缓存:

    3.1 存在,则将缓存内容解压到 node_modules 中;

    3.2 不存在,先从 npm 远程仓库下载包,校验包的完整性,并添加到缓存,同时解压到 node_modules。

  4. 生成 package-lock.json 文件

常用命令集合

总结一些使用npm会常用到的命令:

  1. 全局设置npm源:
npm config set registry xxxx
  1. 查看全局设置的npm源:
npm config get registry xxx
  1. 查看npm设置列表:
npm config list
  1. 查看npm缓存:
 npm cache clean --force
  1. 清除npm缓存:
npm cache clean --force
  1. .npmrc设置
;设置全局源
registry=https://registry.npm.taobao.org/

;设置单个源
@cmvalue:registry=http://npm.cmvalue.net/

nvm管理node与npm依赖

单独更新npm会导致node与npm版本不对应的问题,以及拉高版本会导致某些项目依赖的包无法正常使用的问题,这也是笔者在期间遇到的,因此使用nvm进行node/npm版本切换管理是必要的。

下载nvm

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash

或者

wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash

环境变量生效:

source ~/.bashrc

or  

source ~/.zshrc

查看下本地上的node/npm环境

nvm ls

image.png

下载某个node/npm版本,注意是下载node版本,npm会随着node的版本相应安装

nvm install 14.13.0

查看当前本机node/npm版本:

image.png

发现已生效。