自建私有NPM库Verdaccio

388 阅读2分钟

1.场景

  1. 当自己修改了源码,如elementUI的源码,需要单独发布
  2. 内部开发了通用组件,需要大家一起引用使用

2.方案

  1. 直接修改当前node_moudle里面下载的源码
  2. 使用npm link 可以动态修改本地引用的npm,(把要改的源码fork一份,指向fork)
  3. 使用patch-package 给具体的包做补丁更新
  4. 上传到官网npm
  5. 上传到官网npm+够买私有服务
  6. 上传到内部私有的npm

3.选型

  1. 修改node_moudle,下次换个环境重新install 又会没了修改的代码
  2. 使用link 每次每个人都要单独配置,繁琐并且容易配置错误
  3. patch-package只针对具体的包升级,不能做到独立库的维护
  4. 公网的npm大家都能看到内部私有信息,并且公网有时候会有下载不稳定情况
  5. 据说要按人头每月5美刀,直接忽略
  6. 优点: 稳定,并且私有化,不会被公网的人看到

4.私有npm-verdaccio配置

我们使用目前比较稳定的verdaccio开源项目搭建

1.安装

npm install verdaccio -g 

2.配置 config.yaml

默认配置路径

# window
C:\Users\xxxxx\AppData\Roaming\verdaccio
# linux
/root/.config/verdaccio/

修改后配置

storage: ./storage
plugins: ./plugins
web:
  title: Verdaccio
auth:
  htpasswd:
    file: ./htpasswd
uplinks:
  npmjs:
    url: https://registry.npmmirror.com/ # 改为淘宝源
packages:
  '@*/*':
    # scoped packages
    access: $all
    publish: $authenticated
    unpublish: $authenticated
    proxy: npmjs
  '**':
    access: $all
    publish: $authenticated
    unpublish: $authenticated
    proxy: npmjs

server:
  keepAliveTimeout: 60 
listen:                     # 打开的监听配置
- 0.0.0.0:4873              # 监听所有ip listen on all addresses (INADDR_ANY)
middlewares:
  audit:
    enabled: true

logs: { type: stdout, format: pretty, level: http }
  1. 把默认uplinks的配置改为淘宝源https://registry.npmmirror.com/
  2. 打开了 listen:0.0.0.0:4873 即支持所有ip访问

3.启动+访问

  1. 使用verdaccio 直接启动
  2. 带参数 verdaccio --listen 4000 --config ~./config.yaml 启动时,动态修改配置
  3. 使用pm2 启动 pm2 start verdaccio pm2 stop verdaccio 关闭
  4. 访问 10.7.xx.xx:4873/ ,默认端口是 4873, 要确定防火墙,白名单都打开端口。

4.切换源

使用nrm

# 安装nrm
npm -g i nrm
# 添加源
nrm add verdaccio http://10.7.xx.xx:4873/
# 切换源
nrm use verdaccio
# 查看当前状态
nrm ls

5.npm 创建账号+登录

# 执行添加用户命令
npm adduser
# 依次输入用户名,密码,邮箱。
npm notice Log in on http://10.7.xx.xx:4873/
Username: xxxx 
Password: xxxx 
Email: (this IS public) xxxx@163.com 

# 执行登录命令
npm login
# 依次输入用户名,密码,邮箱。

# 查看当前登录用户信息
$ npm who am i

6.关闭npm用户创建+重启

修改 config.yaml配置

auth:
  htpasswd:
    file: ./htpasswd
    max_users: -1

我们打开max_users 并且设置为-1 ,不允许再创建用户,防止后期被攻击

重启服务

# 关闭服务
pm2 stop verdaccio
# 启动服务
pm2 start verdaccio

7.发布

# 进入具体的npm项目
cd /xx/xx
# 发布
npm publish

5.npm 版本访问链条逻辑

image.png

当我们发布版本时,npm都会同时校验本地+私有+公有的所有版本,不能出现相同的版本号。

如遇到同名时,会提示错误。