最近终于有工夫能够做一些业务需要之外的货色了,就把组件库需要提上了日程。
对于一些不适宜开源的组件,我想到了搭建公有npm仓库。
于是我跑去征询了一下有教训的大佬,大佬微微一笑,说:verdaccio。
这是个啥?
果决关上github搜寻关键词,果然不出我所料,这是一个坐拥11.8kstar的开源库(https://github.com/verdaccio/verdaccio)。
总而言之,这是一个搭建npm仓库的工具。
出于好奇,我去维基百科了一下这个单词:
verdaccio是意大利语,意为彩色、红色和黄色颜料的混合物,其色彩为淡灰色或淡黄色,柔和的绿褐色。
这个词起源壁画,是壁画中的一种「底色」,在底色之上能够更好地去渲染其余色彩。作者之所以起这个名字,其实是因为verdaccio的前身是sinopia(也是一个开源的npm仓库搭建工具),而sinopia意思是壁画底色中的红土色或铁锈色。
不采纳sinopia的起因也很简略,这个我的项目比拟古老,最近一次更新曾经是6年前了。。。
话不多说,间接开撸。
装置运行
verdaccio有两种装置办法,一种是间接装置,一种是用docker镜像。
1.1 间接装置
npm install --global verdaccio@6-next --registry https://registry.verdaccio.org/
装置实现后,就能够在/node/bin
目录下看到一个名为verdacio
的文件,这个文件理论指向的是verdaccio
包下的build/lib/cli.js
。
// cli.js#!/usr/bin/env node"use strict";if (process.getuid && process.getuid() === 0) { process.emitWarning(`Verdaccio doesn't need superuser privileges. don't run it under root`);} // eslint-disable-next-line import/orderconst logger = require('./logger');logger.setup(null, { logStart: false}); // default setuprequire('./cli/cli');process.on('uncaughtException', function (err) { logger.logger.fatal({ err: err }, 'uncaught exception, please report this\n@{err.stack}'); process.exit(255);});
#!/usr/bin/env node
(看到这句的我就晓得事件并不简略) 这句是通知零碎得用node来执行这个脚本文件;process.getuid()
会返回运行过程的用户id,当为0时会提醒不要运行在root用户下(root用户id=0);logger
是verdaccio我的项目下的一个日志模块,当过程捕捉到异样时,就会去更新日志并完结以后过程;require('./cli/cli')
会去加载cli文件,这个文件里会进行一些初始化操作,比方读取.yaml或.yml配置文件的信息,去设置对应的页面题目、图标等信息,创立node服务器并监听配置的端口(如默认配置的4873)等等,通过这一系列简单的操作之后,咱们就能够间接运行verdaccio并通过端口号拜访到对应的页面。
1.2 间接运行
运行verdaccio:
verdaccio
运行胜利!
如果是本地装置,关上浏览器,输出http://localhost:4873
,就能够看到页面:
留神:
- 如果是在服务器上安装,则须要在配置文件中增加
listen: 0.0.0.0:4873
(详见下文中的配置文件),再通过IP+4873端口号在线拜访。 - 如果应用的是云服务器,还需注意防火墙规定:
1.3 pm2守护过程后盾运行
在命令行间接运行verdaccio,过程敞开后就无法访问到页面,所以这里举荐应用pm2守护过程,通过pm2可让verdaccio在后盾运行。
pm2官网:https://pm2.keymetrics.io/
运行verdaccio:
pm2 start verdaccio
进行verdaccio:
pm2 stop verdaccio
2.1 docker装置
docker pull verdaccio/verdaccio:nightly-master
2.2 docker运行
docker run -it --rm --name verdaccio -p 4873:4873 verdaccio/verdaccio
成果和间接装置一样,在浏览器关上链接可拜访到页面。
权限配置
搭建是搭建好了,然而怎么管制拜访权限?
在官网文档里提到了verdaccio应用了一个名为htpasswd的插件来做权限配置,默认的配置文件是verdaccio装置目录下的config.yaml
。
官网文档上有对配置项的具体阐明:https://verdaccio.org/docs/en/configuration。
这是我的配置文件:
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: -1uplinks: npmjs: url: https://registry.npmjs.org/packages: '@*/*': # scoped packages access: $authenticated publish: $authenticated unpublish: $authenticated proxy: npmjs '**': access: $authenticated publish: $authenticated unpublish: $authenticated proxy: npmjsserver: keepAliveTimeout: 60middlewares: audit: enabled: truelogs: { type: stdout, format: pretty, level: http }listen: 0.0.0.0:4873
配置项阐明:
access(拜访权限)、publish(公布权限)、unpublish(勾销公布权限)可选值如下:
- $all:任意用户;
- $anonymous:仅匿名用户;
- $authenticated:仅受权用户。
- max_users:-1,不容许用户注册(此时执行npm adduser会报409谬误;因而需先正文掉这句,在本地注册完用户后再设置为-1)
- listen: 0.0.0.0:4873,没有这句就只能在本地拜访,加上这句才能够通过ip+端口号在线拜访。
批改完配置文件后,重启verdaccio失效:
verdaccio -c config.yaml
此时只有登录了verdaccio的用户能力对仓库里的包进行操作。
npm登录:npm adduser --registry http://xxx.xx.xxx:4873
公布包:npm publish --registry http://xxx.xx.xxx:4873
勾销公布:npm unpublish 包名 --registry http://xxx.xx.xxx:4873
(如果是24h内公布的包,须要加上--force)
下载包:npm install 包名 --registry http://xx.xx.xxx:4873
设为镜像源
npm set registry http://xx.xx.xxx:4873/
执行这句就能够把verdaccio
设为本地全局镜像源,如果在仓库中找不到对应的包,verdaccio
就会去npm
官网仓库尝试拉取对应的包,拉取胜利后会缓存在storage
目录下(压缩包格局)。