verdaccio搭建私有npm仓库

原由

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

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

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

因此,咱们迫切须要一个私有的npm仓库。node

调研

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

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

最终选择使用 verdaccio的缘由:git

  • 轻量化,基本不须要怎么配置,维护负担小
  • 小团队暂时没有作包缓存的须要(也没有富余的机器资源)
  • 官方提供了现成的 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.pnggithub

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

chown -R 10001:65533 /path/for/verdaccio
复制代码

image.png

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

image.png

在项目中使用

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

@xxscrop:registry=http://your-npm-registry.com/
@xxteam::registry=http://your-npm-registry.com/
复制代码

小结

我我的感受 verdaccio 适合小团队或我的作私有库的相关尝试,由于不用怎么折腾就能够快速达到目的。 另外一点优点就是dan提到的本地一些场景的快速验证。docker

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

参考