使用verdaccio部署自己的私有npm仓库

实现Npm私有仓库的方式有很多种,例如Gitlib私有仓库cnpmsinopiaverdaccioGitlib私有仓库cnpm配置很繁琐,不适合快速开发,sinopia已7年多未维护。那剩下只能选择verdaccio了。

verdaccio的前身是sinopia,因为sinopia的作者突然宣布不维护,一些开发大神就收起该烂摊子,基于sinopia@1.4.0开发了verdaccio并一直维护至今。

利用verdaccio部署一个属于自己的私有npm仓库

安装

因为verdaccio只能运行在Node v12以上的环境,在安装前先检查当前Node版本并将其切换到v12以上。

1
2
3
4
5
6
7
8
9
10
11
# 查看node.js版本
node -v

# 利用nvm切换node.js版本
nvm use 16.14.8

# 全局安装verdaccio
npm i -g verdaccio

# 查看verdaccio版本
verdaccio -v

启动

当我们安装完verdaccio以后,在cmd命令行工具输入 verdaccio 如果看到输出下面这样的信息,说明启动成功了:

1
2
3
4
5
6
info --- config file  - C:\Users\mdguozhaoxi\AppData\Roaming\verdaccio\config.yaml
info --- the "crypt" algorithm is deprecated consider switch to "bcrypt" in the configuration file. Read the documentation for additional details
info --- using htpasswd file: C:\Users\mdguozhaoxi\AppData\Roaming\verdaccio\htpasswd
info --- plugin successfully loaded: verdaccio-htpasswd
info --- plugin successfully loaded: verdaccio-audit
warn --- http address - http://localhost:4873/ - verdaccio/5.29.0

根据上面的提示我们可以指导,服务是运行在了本地的4873端口的,那么我们在浏览器里输入http://localhost:4873 看到如下页面,就说明我们的verdaccio服务运行成功!

1
2
3
4
5
6
7
8
# 添加一个用户
npm adduser --registry http://localhost:4873/

# 登录
npm login --registry http://localhost:4873/

# 发布
npm publish --registry http://localhost:4873/

配置

打开宝塔面板的终端工具,登录我自己的服务器。使用上述方式安装verdaccio,安装完毕执行verdaccio -h,发现只有两个参数可修改默认配置。

  • –listen:简写为-l,监听端口,默认是4873
  • –config:简写为-c,配置文件,不同系统路径会不一样

打开FTP工具,找到/root/.config/verdaccio目录中创建config.yaml文件,执行vim /root/.config/verdaccio/config.yaml,加入以下内容。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# url_prefix: /npm/
storage: ./storage
plugins: ./plugins
i18n:
web: zh-CN
web:
title: Npm私有仓库
darkMode: true
auth:
htpasswd:
file: ./htpasswd
uplinks:
npmjs:
url: https://registry.npmmirror.com/
packages:
"**":
proxy: npmjs
access: $all
publish: $authenticated
unpublish: $authenticated
"@*/*":
proxy: npmjs
access: $all
publish: $authenticated
unpublish: $authenticated
server:
keepAliveTimeout: 100
middlewares:
audit:
enabled: true
logs: { type: stdout, format: pretty, level: http }

搭建Npm私有仓库的目的是让托管模块仅对团队成员开放,该仓库只服务具备权限的团队成员且禁止团队外的开发者注册,当然可让其他开发者查看,因此团队成员拥有查看模块、发布模块和删除模块的权限,团队外的开发者拥有查看模块的权限。

packages中使用**表示普通模块,使用@*/*表示范围模块,提供以下参数设置模块的控制权限。

  • proxy:上行链路的代理仓库
  • access:访问权限
  • publish:发布权限
  • unpublish:删除权限

剩余三个参数可选$all/$anonymous/$authenticated,分别表示所有用户匿名用户注册用户。若该仓库不对外公布所有私有模块,可将这三个参数全部设置为$authenticated

完善所有配置后,将监听端口改成8888,将配置文件改成/tool/verdaccio/config.yaml,执行以下命令启动应用。

1
verdaccio -l 8888 -c /tool/verdaccio/config.yaml

pm2常驻

1
pm2 start verdaccio --name verdaccio -- --listen 0.0.0.0:8888

使用

注册用户

1
npm adduser --registry http://localhost:4873/

若将Npm私有仓库部署到外网,其他开发者除了能查看模块,还能通过执行npm adduser --registry https://npm.guozhaoxi.top/注册用户。为了保障Npm私有仓库的安全性与私密性,最好在部署到外网前将所有团队成员注册为Npm私有仓库用户,再配置config.yaml限制新用户注册。

登录用户

1
npm login

输入用户名、密码和邮箱即可。

删除用户

不可避免团队成员的人员变动,因此删除这些离职或转岗的成员的控制权限是必然的。目前verdaccio暂未提供相关解决方案,可通过一个小技巧解决该问题。

上述提到verdaccio使用htpasswd实现用户验证相关功能,而auth-htpasswd-file指定的配置文件是./htpasswd,那对应文件路径是/tool/verdaccio/htpasswd

执行vim /tool/verdaccio/htpasswd,找到那人的账号,整行删除,接着就无那人啥事了。

发布模块

1
npm publish

删除模块

1
npm unpublish

安装模块
对于一个刚拉取下来的项目执行npm i,就会自动识别哪些模块是私有模块。有时并不是所有场景都需提前执行nrm use ynpm,单独安装一个私有模块时指定其Npm私有仓库的镜像即可。

1
npm i <pkg> --registry http://npm.guozhaoxi.top/