1.场景
- 当自己修改了源码,如elementUI的源码,需要单独发布
- 内部开发了通用组件,需要大家一起引用使用
2.方案
- 直接修改当前node_moudle里面下载的源码
- 使用npm link 可以动态修改本地引用的npm,(把要改的源码fork一份,指向fork)
- 使用patch-package 给具体的包做补丁更新
- 上传到官网npm
- 上传到官网npm+够买私有服务
- 上传到内部私有的npm
3.选型
- 修改node_moudle,下次换个环境重新install 又会没了修改的代码
- 使用link 每次每个人都要单独配置,繁琐并且容易配置错误
- patch-package只针对具体的包升级,不能做到独立库的维护
- 公网的npm大家都能看到内部私有信息,并且公网有时候会有下载不稳定情况
- 据说要按人头每月5美刀,直接忽略
- 优点: 稳定,并且私有化,不会被公网的人看到
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 }
- 把默认uplinks的配置改为淘宝源
https://registry.npmmirror.com/, - 打开了 listen:0.0.0.0:4873 即支持所有ip访问
3.启动+访问
- 使用
verdaccio直接启动 - 带参数
verdaccio --listen 4000 --config ~./config.yaml启动时,动态修改配置 - 使用pm2 启动
pm2 start verdaccio,pm2 stop verdaccio关闭 - 访问 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 版本访问链条逻辑
当我们发布版本时,npm都会同时校验本地+私有+公有的所有版本,不能出现相同的版本号。
如遇到同名时,会提示错误。