Npm 疑难杂症
作者: dkvirus 发表于: 2018-07-06 12:09:13 最近更新: 2018-08-01 22:10:32

一、Npm 发布包填坑指南

1. 包往哪里发

就个人经验来说,我们写的包往哪儿发布,无非下面三个地方。其中淘宝镜像仓库每隔十分钟会同步一下 Npm 仓库的新模块,所以实际要看的也就是往 Npm 仓库和公司内部搭建的私有 Npm 仓库上如何发布包。搞不清楚他们的关系就会碰到一些欲罢不能的大坑。

1.1 Npm 仓库

Npm 仓库是一个公共平台,所有人开发的模块想要共享都可以扔上去,有人需要使用什么功能去上面找即可。缺点是服务器架设在国外,国内下载包时速度比较慢。

1.2 淘宝镜像仓库

淘宝镜像仓库由阿里云赞助,在国内搭设的一套服务器,每隔十分钟从 Npm 仓库上同步一下包,内容可以认为和 Npm 仓库是一样的,所以国内一般都会把下载仓库地址设置为淘宝镜像仓库,这样子下载包时会大大加快速度。

1.3 公司内部私有 npm 仓库

有的公司内部开发一些私有包不想上传到公共平台 Npm 仓库,于是乎就搭建公司内部的私有 Npm 仓库,与 Npm 仓库其实差不多,只不过有一个是供全世界开发者使用的平台,一个是只供公司内部使用的平台。

2. 发布包过程

介绍下 npm 发布包的机制。以 Npm 仓库为例说明。

2.1 告诉 npm 往哪个仓库发布包

往哪个仓库发布包也叫做设置上传/发布地址。这个过程记录在 package.json 文件中。publishConfig 属性就记录着仓库地址。我这里是 公司内部搭建的私有 npm 仓库,所以写了一个内部地址。如果是往 Npm 仓库 发布包,该属性可以省略不写。

1
2
3
4
// package.json
"publishConfig": {
"registry": "http://localhost/repository/npm-hosted/"
}

2.2 申请进入仓库的权限

你要往指定仓库发布包,比如往 Npm 仓库 发布包,你得先登录上这个仓库,然后才能进行上传。这是因为 Npm 仓库得知道是谁进行了发布包这个动作,并且还要判断该用户是否有权限进行发布包。这就好比你往一个仓库运输货物,得在大门口登记一下,标明身份不是。如果你的账户名或密码错误,仓库管理员肯定要拦住你,因为你不具备权限进行运输货物。

那么怎么获得进入仓库的账户号呢。以 Npm 仓库为例,登录 Npm 官网,在右上角有个 Sign up 按钮,点击进行注册。记录下有用信息:账户名密码邮箱。如果是公司内部搭建的私有 Npm 仓库,让管理员给你一个账户密码即可。

2.3 进入仓库

就像往仓库运输货物一样,有了进入仓库的权限,那就先登录进入仓库,然后在进行货物上架。

1
2
3
4
5
6
$ npm login

Username: xxxx
Password:
Email: (this IS public) xxxxx@qq.com
Logged in as xxxx on https://registry.npmjs.org/.

为了安全起见,输入密码不会显示任何东西,你只需输入完成按回车即可,不用担心自己是否没有输入上。

像上述代码所示就是登录成功的标志,并且最后一行可以看到我们是要往 https://registry.npmjs.org/ (Npm 仓库)上发布包的。

小tip:

每次登录都要手动输入 账户密码邮箱 这个步骤很是繁琐,有个简单的方法可以一步到位。以 账户: admin密码:admin123 为例进行说明。

打开百度,搜索 base64 关键字,随便点开一个 base64 在线编码/解码 条目,在新窗口左侧/上测输入 admin:admin123 (也即:账户:密码 格式,中间有个英文格式的冒号),点击编码按钮进行编码得到编码后的值 YWRtaW46YWRtaW4xMjM=。打开 npm 配置文件 .npmrc 文件,默认路径为:C:\Users\Administrator\.npmrc,修改内部内容如下。此后再进行 $ npm login 时会自动记住账户密码,一路回车登录即可。

1
2
_auth="YWRtaW46YWRtaW4xMjM="
email=xxxx@qq.com

2.4 发布包

前面一个步骤成功进入仓库,接下来就进行货物上架即发布包。

切换到要发布那个包的根目录下,输入以下指令等待即可。

1
$ npm publish

这个过程可能是遇到问题最多的地方。如果失败了,检查 C:\Users\Administrator\.npmrc 文件。一般的使用 Npm 都会配置淘宝镜像仓库,这样我们在下载 npm 包时会大大提升速度。操作如下:

1
$ npm config set registry https://registry.npm.taobao.org

此时打开 .npmrc 文件会看到变化如下:

1
2
3
_auth="YWRtaW46YWRtaW4xMjM="
email=xxxx@qq.com
registry=https://registry.npm.taobao.org

由于我们这里是往 Npm 仓库 发布包的,这里设置的下载地址是 淘宝镜像仓库,二者不一致会导致错误。可先将最后一行代码删除掉,此时默认下载仓库也是 Npm 仓库。下载仓库地址和上传仓库地址(前面提到的在 package.json 文件中设置的)保持一致才能发布包。发布完成后可以再设置下载仓库为淘宝镜像仓库。

往公司内部私有 Npm 仓库发布包也要注意这个问题,要保证下载仓库和上传仓库都是 公司内部的 Npm 仓库。当然,大多数私有仓库都会设置代理地址,二者并不是一模一样,但是要知道都是内部 Npm 仓库即可。

2.5 更新包

更新包和发布包操作步骤类似,唯一的区别是要修改下 package.json 中的 version 字段,你更新包,总得让包的版本变化一下吧。操作重复上面几步步骤。

二、无法安装 devDepen.. 里的包

1. 分析原因

  • 起初无法安装 devDependencies 下依赖包,急的不行,以为是 npm 版本有问题,陆续安装了 node@6.11.5node@8.0.0node@8.6.0 都试了还是不行;
  • 我就像是不是哪个配置项有问题,立马去 C:\Users\Administrator\.npmrc 下去查看 .npmrc 文件,这个文件会记录 npm 的默认配置,发现里面就只配置了一个淘宝镜像,也没其它配置可看,此时就开始怀疑是不是安装其它环境影响了 Node 的环境;
  • 第二天在我同事电脑上安装了 nvm 和 node,测试是可以成功安装 devDependencies 下的依赖包,此时就可以排除是 npm 版本问题了,应该是我本机某些配置项出现了差错;
  • 查看配置信息 $ npm config list,该指令只能查看 .npmrc 下的基础配置信息,前面已经说过,突然发现最下面提示一行 $ npm config ls -l,该指令可以查看 npm 自身默认配置信息,查看可以得到将近百条信息;
  • 有时就靠那么点灵感,嫩你怎么想,也不会想到是 npm 自身默认配置信息出问题了啊,可偏偏就出在这里,我将我同事电脑里的默认配置和我本机默认配置在在线文本比较工具比较之后终于找到这个罪魁祸首 —— production 属性。

2. 解决方法

npm 有个默认配置项 production (生产)设置为 true 时就不会安装 devDependencies 下的依赖包。

1
2
// 配置成 false,意思是不在生产环境下
$ npm config set production false

3. 分析起因

问题解决了,就思考为什么会出现这种情况,想到在不久之前在 windows 的环境变量里添加了 NODE_ENV = production 这条属性,可能就是这个影响到了它。

环境变量中配置 NODE_ENV

首页
友链
归档
dkvirus
动态
RSS