需求背景

做私有库的工具有很多,如上一篇介绍的轻量级的npm包管理工具verdaccio。但刚好maven私服用的是nexus,所以最后选择了nexus来做npm的私服,和maven一套便于维护。

————————————————————————-nexus安装过程省略————————————————————————-

创建 repository

Nexus Repository Manager 3 可以用于多种类型的包管理。此处我们要搭建的是npm包管理私服。
登录在界面点击设置按钮,如下图所示。
image.png
进入设置界面,点击 Repository -> Repositories -> Create repository,接下来会进入到 Repositorty 的选择
image.png
image.png
npm 有三种选择:

  • 第一种:代理 npm 仓库,将公共 npm 服务器的资源代理缓存,减少重复下载,加快开发人员和CI服务器的下载速度。创建时选择 npm(proxy) ,只需填写 Name 和 Remote storage (公有库域名)即可。

image.png

  • 第二种:私有 npm 仓库,用于上传自己的npm包以及第三方npm包。同样的创建步骤,只不过选择的仓库类型为 npm(hosted)。 只填写 Name 即可

image.png

  • 第三种:npm 仓库组,用于将多个内部或外部 npm 仓库统一为一个 npm 仓库。被添加到 npm 仓库组中的其他仓库内的包都能够通过该 npm 仓库组访问到。
    新建一个 npm仓库组将上面两个刚刚创建的 npm 仓库都添加进去。这样可以通过这个 npm 仓库组,既可以访问公有 npm 仓库又可以访问自己的私有 npm 仓库。
    与上面同样的创建步骤,只不过选择的仓库类型为 npm(group),起一个名字 Name,然后选择需要添加到组里的其他 npm 仓库。

image.png

验证是否可用

在 Repositories 中点击创建的 仓库。可以查看该仓库的 URL。
image.png
在项目目录下创建 .npmrc 文件。文件内容为:
registry=私有库包地址
然后随便安装一个包试试(—loglevel info:日志级别设置为 info),从打印的日志中可以发现确实是从设置的 npm 私服下载的包:
$ npm --loglevel info install react

发布到 npm 私服

除了从 npm 私有库安装依赖,我们还需要将公司内部的代码打包发布到私有库中,这里需要设置 Nexus Repository Manager 的权限,这样才能使用 npm login 认证登录到我们的私服。

  1. 添加权限认证:设置权限,左侧菜单 Security -> Realms 菜单,将 npm Bearer Token Realm 添加到右边

image.png

  1. 创建角色:创建 nx-deploy 角色,并赋于他 nx-repository-view---* 权限

image.png

  1. 创建用户:创建用户deployer,同时设定角色为 nx-deploy
  2. 全局登录:执行命令,提示填写账号密码和邮箱,验证通过后将会在用户主目录下的 .npmrc 文件中插入一条 此仓库 url 和对应的 token。

    1. npm login --registry=私有库包地址
  3. 项目局部登录,在项目中的 .npmrc 文件配置
    _auth是 username:password 的 base64 值,这样设置的好处是 publish 时就不用 login 了

    1. registry=私有库包地址
    2. email=deployer@qq.com
    3. always-auth=true
    4. _auth="ZGVwbG95ZXI6ZGVwbG95ZXI="
  4. 发布控件到 npm 私有库中:在 package.json 配置,然后在包根目录执行 npm publish 即可。

    1. "publishConfig" : {
    2. "registry" : "私有库 npm-hosted 包地址"
    3. }

    若不想在 package.json 配置,也可以在命令行指定,如下:

    1. npm publish --registry=私有库 npm-hosted 包地址

错误解决

  1. 401无权限:
    1. npm install
    2. npm ERR! code E401
    3. npm ERR! Unable to authenticate, need: BASIC realm="Sonatype Nexus Repository Manager"
    解决办法:需要登录nexus,勾上 Administration – Secturity – Anonymous 中的 Allow anonymous users to access the server。