使用 verdaccio 搭建私有 npm 仓库

2021-04-14 · 5 min read

起因

最近在做一个业务组件库的项目,公司内部又没有私有的npm仓库,所以就将组件库放到gitlab上做版本控制。

但是放在gitlab的话,管理起来十分麻烦:

  • 版本发布时候,需要构建代码并推到仓库中,然后再打tag
  • 项目中安装的版本时候,需要按gitlab仓库地址安装,并且在每次更新时需要手动改tag号

所以,我们迫切需要一个私有的npm仓库。

调研

经过一番搜寻,发现目前大概有三种方式来做私有的npm库

我在本地先后体验了 cnpmverdaccio 两个工具的发布和部署。

最终选择使用 verdaccio的原因:

  • 轻量化,基本不需要怎么配置,维护负担小
  • 小团队暂时没有做包缓存的需要(也没有富余的机器资源)
  • 官方提供了现成的 docker 镜像,几乎可以一键上线
  • dan大佬的好评
docker pull verdaccio/verdaccio

image.png

部署

  1. 配置 docker-compose.yml
version: '3.1'

services:
  xx_npm_registry: # 修改这里
    image: verdaccio/verdaccio
    container_name: "xx_npm_registry"  # 修改这里
    ports:
      - "4873:4873" 
    networks:
      - node-network
    # 自定义配置
    volumes:
      - "./storage:/verdaccio/storage"
      - "./config:/verdaccio/conf"
      - "./plugins:/verdaccio/plugins"  
networks:
  node-network:
    driver: bridge
  1. 创建配置文件 ./config/config.yaml
storage: /verdaccio/storage # 文件存储,默认使用内置本地文件模式存储

# 账号与认证
auth:
  htpasswd:
    # 默认使用htpasswd,创建的用户会添加到本地文件htpasswd中
    file: /verdaccio/conf/htpasswd 

# 上游registry地址配置
uplinks:
  npmjs:
    # 该仓库没有的包会去上游registry去获取
    # 这里配置为淘宝的npm registry
    url: https://registry.npm.taobao.org/     
    
# 包下载、发布限制
packages:
  "@jiedianfe/*":
    access: $all
    publish: $authenticated
  "**":
    access: $all
    publish: $all
    proxy: npmjs

# 日志
logs:
  - {type: stdout, format: pretty, level: http}

# 私有仓库前端页面配置
web:
  enable: true # 启用前端页面
  title: xxNPM # 修改这里
  # logo: logo.png
  # scope:
  1. 配置nginx转发
server {
  listen 80;
  listen 443 ssl http2;
  server_name npm.xxxx.com; # 修改这里
  include /etc/nginx/sites-enabled/ssl_certificate;
  location / {
    # xx_npm_registry与docker-compose.yaml中的服务名对应
    proxy_pass              http://xx_npm_registry:4873; 
    
    proxy_set_header        Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-NginX-Proxy true;
    proxy_ssl_session_reuse off;
    proxy_set_header Host $http_host;
    proxy_redirect off;
  }
}
  1. 检查相应目录权限

我在本地体验时,卡在了文件权限这一步。 具体表现是,网站可以正常启动,但是 npm addusernpm publish 都不会成功,原因就是没有相应的权限。 image.png

最终结合文档中提到的权限问题和网上其他同学的解决方法搞定了

chown -R 10001:65533 /path/for/verdaccio

image.png

  1. 启动 docker-compose up --build -d

image.png

在项目中使用

.npmrc中配置,对应的scope走私有库即可

@xxscrop:registry=http://your-npm-registry.com/
@xxteam::registry=http://your-npm-registry.com/

小结

我个人感觉 verdaccio 适合小团队或个人做私有库的相关尝试,因为不用怎么折腾就可以快速达到目的。 另一点优势就是dan提到的本地一些场景的快速验证。

缺点的话就是配置确实很少,如果对于npm私有库的需求比较复杂,比如权限控制、包缓存等就不太适合了。 场景比较复杂的话,可能使用 cnpm 更加合适。cnpm 虽然部署上略微麻烦一些,但是在持久存储有更多的选择,比如可以使用 mysqlsqlite。权限控制上可以配置的东西也丰富一些。

参考


Profile picture

Blogs by Leo Yang who lives and works in Chengdu writing interesting things. You should follow me on Github 😁