uncategorized

使用verdaccio搭建企业私有npm仓库

前言

因为国内的网络环境问题,对于使用 npm 的企业或者组织来说,替换npm源一定是驾轻就熟,如我们常用的淘宝源

淘宝源以其优异的软硬件性能,保障了我们下载npm依赖的速度体验,其本质上是一个可以让我们下载npm包的资源服务器

另一方面,企业在开发的过程中,也会沉淀出一些没有必要发布到公网环境的包,如一些和企业业务强相关的业务库,还有一些是包含了企业核心技术和敏感信息的库,这些库都不适合上传到 npmjs.org 或者 npm.taobao.org

verdaccio 就为搭建企业npm仓库提供了简便易达的解决方案

Why Verdaccio 🤔

搭建这样一个npm仓库能解决两个直观的问题

缓存下载过的npm包

npm 包中存在大量的重复依赖,比如 request 库,一层一层依赖下来,可能10个涉及网络情况的库里有8个会直接或间接依赖到这个库。这些库下过一次即缓存在本地,可以提升整个依赖树的 npm install 的速度, 并且随着私有仓库的使用次数越来越多,仓库缓存的包也会越来越多,越来越趋近于全量仓库,这时无论再安装什么包基本都能命中私有仓库缓存,这时就能极大提升安装速度。不可否认淘宝源已经大大提高了npm库的下载体验,但缓存在本地的库在下载速度上更是登峰造极

发布自己的私有包

在生产研发的过程中积累的工具库,支持库等就可以直接publish到私有仓库,从而与外界隔离,保证安全性

使用 npm 私库前后请求结构示意图

直接访问 npmjs 或者淘宝源
336f7e9a-7a6c-e136-8733-f2421166584b.png

访问私库
e80b5de6-c2b3-8a00-0cda-f7514e16d36c.png

私库就像在出网前架设了一层代理层,它来负责帮你取回你需要的包,如果他已经做过这个事情了,那就直接把包交给你,如果没有则继续请求上游仓库

安装

verdaccio 可以通过npm进行安装,一行命令搞定

1
$ npm i -g verdaccio

如果没有特别的配置需求,使用默认配置启动也是一行命令

1
$ verdaccio

4410483e-143b-67ec-4b5d-948136ba8d3d.png

打开 localhost:4873 会看到如下页面
f270ae80-8299-f3db-bcc7-8d5ad78fa3b1.png

如上的启动方式会在特定的地方创建默认配置文件,并以默认配置文件启动进程

OSX 和 Unix 操作系统的配置创建目录为 ~/.config/verdaccio/config.yaml
默认监听4873端口

如此一来,一个可以使用的npm私有仓库就启动起来了

和使用淘宝源一样,本质上是在使用npm命令的时候,更改 registry 配置,指定要安装的包的来源,常用的有两种方式

  1. 在npm参数中指定源

    1
    2
    3
    4
    $ npm install <package> --registry='http://localhost:4873'
    # 更进一步,可以把这条指令抽取成 alias
    export mynpm="mynpm --registry='http://localhost:4873'"
    # 每次需要运行 npm 的时候就运行 mynpm
  2. 使用 npm set 来指定

    1
    $ npm set registry http://localhost:4873

关键配置

在众多配置中,有几项配置比较值得关注

verdaccio 的配置文件是基于 yml 的,需要注意缩进(用缩进区分层级)

packages

1
2
3
4
5
packages:
'@*/*':
access: $all
publish: $authenticated
proxy: npmjs

上述配置控制的是仓库里的包的访问行为

  1. @*/* 表示接下来的配置是针对 scoped 的包,如 @vue/some-package
  2. @vue/* 表示接下来的配置针对 @vue 这个 scope 下的任意库的
  3. vue-* 表示接下来的配置针对以vue-开头的库
  4. ** 表示接下来的配置针对任意库

accesspublish 分别控制访问(下载)和发布的权限范围
proxy 控制从哪个下载源(uplink)

uplinks 类似于 git 的 remote,说白了就是私库的上游是什么,当私库中不存在用户要安装的包时,就会继续往上游拉取

1
2
3
4
5
6
7
uplinks:
npmjs:
url: https://registry.npmjs.org/
cnpm:
url: https://url.of.cnpm.org/
private1:
url: https://192.168.0.100:6999/

例如上述配置,指定了三个不同的源,分别对应于 官方npm, 淘宝npm, 其他私有库

uplinks 可以在 packages 中,根据不同组的下载需求,配置 proxy

例如

1
2
3
4
5
packages:
'@restrict/*':
access: $all
publish: $authenticated
proxy: private1

上述配置表明 @restrict scope下的包,都从 https://192.168.0.100:6999/ 这个源下载

实操之更进一步

在实际企业运维的情况下,我们肯定不能直接在终端执行 verdaccio 命令就结束战斗,因为这样会存在一些问题,如

  1. 没有办法对实际的平台运行内存消耗进行监控
  2. 如果机器重启,那这个 verdaccio 进程也就消失殆尽了
  3. 如果是服务器环境,总不能开个 verdaccio 占满输入输出吧?如果用户退出了呢?可能有的人会选择使用 nohup 之类的,也可以一定程度上达到目的,但在我个人看来总归不太稳

如果你的需求只是简单的让服务跑起来,甚至可以容忍这些不稳定因素的话,那么搭建过程到这里就结束了
如果你对服务运维有更加稳定的需求,那么还需要启动额外的运维辅助程序

针对以上几个方面,使用一些 node app 的运维管理应用来辅助运行这个私库程序会更好
在我的实际经验中,pm2 能在这方面带来比较好的体验

pm2

PM2 是一个帮助你管理并保持你的Nodejs应用 7/24 小时在线的后台程序

也就是 pm2 的特性可以帮助你更好地在后台运行 nodejs 应用

pm2 安装 & 运行

1
2
3
4
# Install
$ npm i -g pm2
# pm2 start
$ pm2 start `which verdaccio`

让 pm2 找到 verdaccio 的执行 bin 路径,并启动即可

这时用 pm2 list 可以查看运行的 verdaccio 进程

pm2 的其他更多用法在本文暂不赘述

◉ End.


参考资料:

  1. Verdaccio Documentation

如博文有叙述不妥以及不准确的地方, 望各位看客不吝赐教, 感谢.

Share