起因
公司内部的node工具、插件、组件,可以使项目开发效率得到大大的提升。将其发布到npm可以集中进行下载管理。
但是发布到npm的模块是开源的,我们只能共享大家都能用的开源模块 。 而对于公司的业务代码我们当然是不能开源的。这时候就需要搭建一个类似于 https://www.npmjs.com/平台私有的npm仓库,用于企业里面常用的业务模块,如业务组件的存放和快速安装。
优势
- 便于管理企业内的业务组件或者模块
- 私密性
- 确保npm服务快速、稳定
- 控制npm模块质量和安全(防止恶意代码植入)
verdaccio
业界主流的私有npm仓库搭建的方案有如下几种:
- 付费购买
- 使用 git+ssh 这种方式直接引用到 GitHub 项目地址
- 使用 sinopia
- 使用 verdaccio
方案1: 需要公司提供经费,而且npm在国内访问慢,体验也不一定好
方案2: 不能更新即 npm update
不能使用semver(语义化版本规范)
方案3: sinopia 虽然开源,但已经好久没有人维护,坑比较多
方案4: verdaccio 是 sinopia 开源框架的一个fork,开源免费且尚在维护
安装
只需要npm
环境,全局安装:
1 | npm install -g verdaccio |
运行
安装完成后在命令行输入:
1 | verdaccio |
此时服务已经在红框地址启动(默认4873端口),可以打开这个地址进入首页
发布
可以永久修改镜像:
1
npm config set registry http://localhost:4873
之后下面所有操作不需要加
--registry http://localhost:4873
可以通过以下方式查看当前的镜像:
返回**https://registry.npmjs.org/ **是默认的官方地址,表示未设置
1
npm config get registry
这种方式修改后,安装非私有包时,需要切换回官方默认地址。切换npm镜像推荐工具nrm,直接npm全局安装即可;主要有三个指令
nrm ls
查看当前的所有镜像源:name: url
nrm add [name] [url]
添加镜像源nrm use [name]
使用镜像nrm del [name]
删除镜像或者直接删除镜像配置:
npm config delete registry
添加用户并登录
1
npm adduser --registry http://localhost:4873
发布到私有仓库
1
npm publish --registry http://localhost:4873
发布成功后刷新首页回出现对应的信息:
安装发布到私有仓库的包
1
npm i xx -g --registry http://localhost:4873
主要就是注意使用私有仓库时使用verdaccio启动的服务镜像地址代替官方默认的registry
配置
verdaccio启动后,下图红框位置为配置文件的路径:
基本配置
1 | # #号后面是注释 |
storage
已发布的包的存储位置verdaccio启动私有服务的时候默认会在当前目录下生成storage文件夹,里面有*.verdaccio-db.json*存放数据,若服务意外关闭,下次启动时只要启动目录有这个文件夹,已发布的数据就不会丢失
plugins
插件所在的目录web
界面相关的配置auth
用户相关,例如注册、鉴权插件(默认使用的是htpasswd
)uplinks
用于提供对外部包的访问,例如访问 npm、cnpm 对应的源packages
用于配置发布包、删除包、查看包的权限server
私有库服务端相关的配置middlewares
中间件相关配置,默认会引入auit
中间件,来支持npm audit
命令logs
终端输出的信息的配置
权限
主要通过修改配置packages
和auth
控制权限
packages
配置包发布、查看、删除权限。用户权限有三个可选值:$all
所有人$anonymous
未注册用户$authenticated
注册用户
1
2
3
4
5
6
7
8
9
10
11packages:
'@*/*': #匹配包名
access: $all #访问权限
publish: $authenticated #发布权限
unpublish: $authenticated #删除权限
proxy: npmjs
'**':
access: $all
publish: $authenticated
unpublish: $authenticated
proxy: npmjsauth
用户注册权限如果私有仓库部署到外网,任何人都可以通过
npm adduser
注册用户。可以设置max_users: -1
来禁止后续用户注册1
2auth:
max_users: -1
发布包推送
每次发布包时可通过群机器人来发送通知,下面以钉钉为例
首先需要群机器人对应的
Webhook
(可查看钉钉文档获取)配置中添加
notify
1
2
3
4
5
6notify:
'dingtalk':
method: POST
headers: [{'Content-Type': 'application/json;charset=utf-8'}]
endpoint: https://oapi.dingtalk.com/robot/send?access_token=****, # 钉钉机器人的 webhook
content: '{"color":"green","message":"新的包发布了: * {{ name }}*","notify":true,"message_format":"text"}'
企业微信也都可以接入通知,文档地址 需要机器人对应的Webhook
- 本文作者: MR-QXJ
- 本文链接: https://mr-qxj.github.io/2021/11/17/部署/npm私服方案 - verdaccio/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!