Nexus 搭建 npm 私有库

3,385 阅读3分钟

这是我参与8月更文挑战的第2天,活动详情查看:8月更文挑战

需求背景

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

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

创建 repository

Nexus Repository Manager 3 可以用于多种类型的包管理。此处我们要搭建的是npm包管理私服。

登录在界面点击设置按钮,如下图所示。

进入设置界面,点击 Repository -> Repositories -> Create repository,接下来会进入到 Repositorty 的选择

npm 有三种选择:

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

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

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

验证是否可用

在 Repositories 中点击创建的 仓库。可以查看该仓库的 URL。

在项目目录下创建 .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 添加到右边

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

  1. 创建用户:创建用户deployer,同时设定角色为 nx-deploy
  2. 全局登录:执行命令,提示填写账号密码和邮箱,验证通过后将会在用户主目录下的 .npmrc 文件中插入一条 此仓库 url 和对应的 token。
npm login --registry=私有库包地址
  1. 项目局部登录,在项目中的 .npmrc 文件配置
    _auth是 username:password 的 base64 值,这样设置的好处是 publish 时就不用 login 了
registry=私有库包地址
email=deployer@qq.com 
always-auth=true
_auth="ZGVwbG95ZXI6ZGVwbG95ZXI="
  1. 发布控件到 npm 私有库中: 在 package.json 配置,然后在包根目录执行 npm publish 即可。
"publishConfig" : {
  "registry" : "私有库 npm-hosted 包地址"
}

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

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

错误解决

  1. 401无权限:
npm install
npm ERR! code E401
npm ERR! Unable to authenticate, need: BASIC realm="Sonatype Nexus Repository Manager"

解决办法:需要登录nexus,勾上 Administration – Secturity – Anonymous 中的 Allow anonymous users to access the server。