在公司内部有时因为业务需要我们建立自己的npm包私有仓库,以方便各个项目代码共用。verdaccio是比较方便搭建npm私有仓库的包。

verdaccio 的特点:

  • 不同步拉取npm库,占据大量硬盘,没有硬盘被撑爆的问题;
  • 安装配置极其简单,不需要数据库;
  • 支持配置上游registry配置,拉取即缓存;
  • 支持forever及pm2守护进程管理;
  • 私有npm package 管理
  • 支持 docker 等应用容器

安装 Verdaccio

1
$ npm install --global verdaccio

注意: verdaccio对Node.js有一定的要求,确保使用较新版本的Node.js。

配置 Verdaccio

verdaccio配置文件在:~/.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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
##设置NPM包的存放目录
storage: ./storage

# 配置WEB UI界面
web :
title : '搭建私有NPM'
#logo : logo.png

## 设置用户验证的文件。
auth:
htpasswd:
file: ./htpasswd
max_users: 1000 #默认为1000,改为-1,禁止注册

# 设置其它的npm注册源(registry)
uplinks:
npmjs:
url: https://registry.npmjs.org/

#配置权限管理
packages:
'@*/*':
#表示哪一类用户可以对匹配的项目进行安装 【$all 表示所有人都可以执行对应的操作,$authenticated 表示只有通过验证的人可以执行对应操作,$anonymous 表示只有匿名者可以进行对应操作(通常无用)】
access: $all
#表示哪一类用户可以对匹配的项目进行发布
publish: $authenticated

'*':
#表示哪一类用户可以对匹配的项目进行安装
access: $all

#表示哪一类用户可以对匹配的项目进行发布
publish: $authenticated

# 如果一个npm包不存在,它会去询问设置的代理。 建议屏蔽掉它
# proxy: npmjs

# 日志输出设置
logs:
- {type: stdout, format: pretty, level: http}
#- {type: file, path: verdaccio.log, level: info}

#修改监听的端口
#listen: 0.0.0.0:4873


注意: proxy建议屏蔽掉,因为如果是公司内部使用,确保可以清晰的知道下载的包来源比较安全。

verdaccio默认监听的端口是:4873

pm2 管理 verdaccio

verdaccio本质是个Node.js服务,可以通过pm2对它进行进程管理。

1
$ pm2 start verdaccio # 启动 verdaccio

配置Nginx反向代理

verdaccio监听的是本地端口,为了方便外部用户访问最好在Nginx配置一个反向代理

1
2
3
4
5
6
7
8
server {
listen 80;
server_name registry.npm.xxxxx.com;
location / {
proxy_pass http://127.0.0.1:4873/;
proxy_set_header Host $host;
}
}

sudo systemctl reload nginx.service 重启Nginx

nrm

搭建好自己的私有npm仓库后,你需要将本地的npm registry指定为自己的私有仓库路径。

nrm是 npm registry 管理工具, 能够查看和切换当前使用的registry。不安装也可以,安装会更高效。

1
2
3
4
5
6
7
8
9
10
11
$ npm install -g nrm # 全局安装 nrm
$ nrm ls # 查看 nrm拥有的 registry地址
* npm ----- https://registry.npmjs.org/
cnpm ---- http://r.cnpmjs.org/
taobao -- https://registry.npm.taobao.org/
nj ------ https://registry.nodejitsu.com/
rednpm -- http://registry.mirror.cqupt.edu.cn
skimdb -- https://skimdb.npmjs.com/registry

$ nrm add [registryName] [registry url] # 添加新的 registry地址 nrm add newNpm http://xxx
$ nrm use [registryName] # 切换 registry地址 nrm use taobao

发布私包和下载

通过nrm将你的registry地址切换为自己私有仓库的路径后,通过npm install下载的包都会从自己私有仓库下载。

如果发布私有包只需要npm publish一下就可以。但如果你是第一次发布包,你需要让通过npm adduser在私有仓库上注册一个账户。

参考

https://juejin.im/post/5ab07687f265da2396123513

https://segmentfault.com/a/1190000015713260