npm 私有仓库的原理
用户 install 后向私有 npm 发起请求,服务器会先查询所请求的这个模块是否是我们自己的私有模块或已经缓存过的公共模块,如果是则直接返回给用户;如果请求的是一个还没有被缓存的公共模块,那么则会向上游源请求模块并进行缓存后返回给用户。上游的源可以是 npm 仓库,也可以是淘宝镜像。
npm 私有仓库框架选型
Nexus 是 Java 社区的一个方案,可以用于 Maven、npm 多种类型的仓库,界面比较丑。
Sinopia 是基于 Node.js 构建的,已经年久失修不维护了。
Verdaccio 比较偏向于一个零配置、轻量型的私有 npm 模块管理工具,不需要额外的数据库配置,它内部自带小型数据库,支持私有模块管理的同时也支持缓存使用过的公共模块,发布及缓存的模块以静态资源形式本地存储。
cnpm 支持静态配置型用户管理机制,以及分层模块权限设置,可以实现公共模块镜像更新以及私有模块管理,支持拓展多种存储形式,相对的数据库的配置较多,部署过程略复杂,是淘宝及多家大型公司搭建内部私有 npm 仓库选择的方案。
常用的仓库地址
- 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
- npmMirror —— https://skimdb.npmjs.com/registry
- edunpm —— http://registry.enpmjs.org
Verdaccio 框架
Verdaccio 是一个 Node.js 创建的轻量的私有 npm proxy registry。
- 基于 Node.js 的网页应用程序
- 私有 npm registry
- 本地网络 proxy
- 可插入式应用程序
- 易安装和使用
- 提供 Docker 和 Kubernetes 支持
- 与 yarn, npm 和 pnpm 100% 兼容
- forked 于 sinopia@1.4.0 并且 100% 向后兼容。
实现思路
- 搭建 verdaccio 私有库
- 使用 pm2 管理进程,避免服务挂掉的情况
- 发布安装 npm 包
- 使用 nrm 管理\切换 npm registry
node.js 安装 verdaccio
pnpm install -g verdaccio
启动 verdaccio
verdaccio
warn --- config file - C:\Users\Administrator\AppData\Roaming\verdaccio\config.yaml
warn --- Plugin successfully loaded: verdaccio-htpasswd
warn --- Plugin successfully loaded: verdaccio-audit
warn --- http address - http://localhost:4873/ - verdaccio/5.4.0
config.yaml 配置
C:\Users\Administrator\AppData\Roaming\verdaccio\config.yaml
:
逐个认识一下默认配置中的几个值的含义:
storage
已发布的包的存储位置,默认存储在~/.config/Verdaccio/
文件夹下plugins
插件所在的目录web
界面相关的配置auth
用户相关,例如注册、鉴权插件(默认使用的是htpasswd
)uplinks
用于提供对外部包的访问,例如访问 npm、cnpm 对应的源packages
用于配置发布包、删除包、查看包的权限server
私有库服务端相关的配置middlewares
中间件相关配置,默认会引入auit
中间件,来支持npm audit
命令logs
终端输出的信息的配置
着重配置:
storage
:#所有包的缓存目录 建议修改如:D:\npmPackes\storagelisten
: 0.0.0.0:4873 #建议追加该配置,不配置只能本地访问,若只是本地访问可不用 。- 访问控制三种身份:所有人(“
$all
”),匿名用户(“$anonymous
”),认证(登陆)用户(“$authenticated
”) 。一般发布者都设置成 认证/登陆用户(“$authenticated
”)。安装者设置成所有人(“$all”)。 proxy
:代理 表示没有的包 verdaccio 库会去这个 npmjs (即配置中https://registry.npmjs.org/)里面去找.
权限把控:
- 禁止用户注册(在团队成员已注册完成后)
- 限制 npm 包的查看,只能为已注册的用户
uplinks常用仓储有:
npmjs:
url: https://registry.npmjs.org
yarnjs:
url: https://registry.yarnpkg.com
cnpmjs:
url: https://registry.npm.taobao.org
storage: ./storage
plugins: ./plugins
web:
title: Verdaccio
auth:
htpasswd:
file: ./htpasswd
# Maximum amount of users allowed to register, defaults to "+inf".
# You can set this to -1 to disable registration.
max_users: -1
uplinks:
npmjs:
url: https://registry.npmjs.org/
packages:
"@*/*":
access: $authenticated
publish: $authenticated
unpublish: $authenticated
proxy: npmjs
"**":
access: $authenticated
publish: $authenticated
unpublish: $authenticated
proxy: npmjs
使用 pm2 启动 verdaccio
pm2 守护 verdaccio 进程:
安装 pm2:
npm install -g pm2 --unsafe-perm
首先找到 verdaccio 的安装目录,就是 npm 安装全局包的路径。
verdaccio -h
Launch the server
━━━ Usage ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
$ C:\Users\Administrator\AppData\Local\pnpm\nodejs\16.13.2\node.exe C:\Users\Administrator\AppData\Roaming\npm\pnpm-global\5\node_modules\verdaccio\bin\verdaccio
找到 verdaccio 文件夹并打开 bin 文件夹:
verdaccio 的启动文件的路径就是 C:\Users\Administrator\AppData\Roaming\npm\pnpm-global\5\node_modules\verdaccio\bin\verdaccio
启动 verdaccio:
pm2 start C:\Users\Administrator\AppData\Roaming\npm\pnpm-global\5\node_modules\verdaccio\bin\verdaccio
如果你的
pm2
的启动路径和verdaccio
的启动文件的路径在一个目录下可直接pm2 start verdaccio
启动成功如下:
id | name | namespace | version | mode | pid | uptime | ↺ | status | cpu | mem | user | watching |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | verdaccio | default | 5.4.0 | fork | 10340 | 1s | 0 | online | 0% | 69.8mb | Adm… | disabled |
status 为“online”即为成功,然后打开对应地址http://localhost:4873 或者你配置的端口
查看该进程详细信息:
pm2 show verdaccio
查看错误日志:
pm2 logs
用户管理/私有包管理
设置仓库源:
npm set registry http://localhost:4873
npm install --registry http://localhost:4873
添加用户:
npm adduser --registry http://localhost:4873
输入 username、password 以及 Email 即可
登录:
npm login --registry http://localhost:4873
上传私有包:
npm publish --registry http://localhost:4873