verdaccio
在公司项目开发中,我们经常会有相同的业务逻辑或者组件可以复用;但是这些由于安全性,我们又希望将这些代码在内部项目中使用,并不希望公开访问;verdaccio 提供了一个搭建 npm 私有服务器的方式,我们来看下如何搭建以及上传我们自己的依赖包。
介绍及安装
Verdaccio 是什么?
Verdaccio 是一个 Node.js 创建的轻量的私有 npm 代理注册源(proxy registry)
通过 Verdaccio 搭建私有 npm 服务器有着以下优势:
- 零配置:无需安装数据库,基于 nodejs,安装及运行。
- 使用方便:将内部高复用的代码进行提取,方便在多个项目中引用。
- 安全性:仓库搭建在局域网内部,只针对内部人员使用。
- 权限管理:对发布和下载 npm 包配置权限管理。
- 加速包下载:将下载过的依赖包进行缓存,再次下载加快下载速度。
首先进行全局安装:
# 全局安装
npm install -g verdaccio
# 启动服务器
verdaccio
安装后直接输入命令即可运行:
config.yaml 是配置文件的路径,我们可以进行权限等配置;4873 是 Verdaccio 启动的默认端口,支持在配置文件中进行修改;我们再浏览器中打开 localhost:4873 就能看到他的管理界面了:
通过命令行启动的话,如果终端停止了,那我们的服务器也就停止了,因此一般我们通过 pm2 启动守护进程。
npm install -g pm2
pm2 start verdaccio
pm2 list
这样 verdaccio 就在后台运行了。
如果不想使用,可以停止或者删除进程
pm2 stop verdaccio
pm2 delete verdaccio
除此之外,我们还可以通过 docker 来进行安装
docker run --name verdaccio -itd -v ~/docker/verdaccio:/verdaccio -p 4873:4873 verdaccio/verdaccio
nrm 管理镜像源地址
Verdaccio 安装好后,我们可以更改 npm 源为本地地址:
# 设置 npm 使用的源为本地私服
npm set registry http://localhost:4873/
或者针对某个依赖安装时选用自己的源地址:
npm install lodash --registry http://localhost:4873
但是如果我们想再次切换到淘宝或者其他的镜像地址,就不那么方便了;我们可以通过 nrm 这个工具来管理我们的源地址,可以查看和切换地址;首先还是进行安装:
npm install -g nrm
安装后我们可以通过 nrm add [name] [address]
这个命令来新增一个源地址:
nrm add verdaccio http://localhost:4873/
使用 nrm ls
可以查看我们使用的所有源地址,带*
是正在使用的地址;通过 nrm use [name]
来切换地址:
* npm ---- https://registry.npmjs.org/
cnpm --- http://r.cnpmjs.org/
taobao - https://registry.npm.taobao.org/
nj ----- https://registry.nodejitsu.com/
rednpm - http://registry.mirror.cqupt.edu.cn/
npmMirror https://skimdb.npmjs.com/registry/
edunpm - http://registry.enpmjs.org/
verdaccio --- http://localhost:4873/
客户端镜像源切换为服务器地址
// nrm 查看 registry 地址列表
nrm ls
// nrm 切换 registry 地址
nrm use verdaccio
// nrm 删除 registry 地址
nrm del verdaccio
添加用户(已创建用户则跳过此步骤)
服务端npm adduser
添加用户,客户端npm login
登录用户。使用 nrm 切换镜像源为服务器地址
npm notice Log in on http://localhost:4873/
Username: xinjn
Password:123456
Email: 422075616@qq.com
Logged in as test on http://localhost:4873/.
然后使用服务端创建的用户登录,可以使用 npm who am i
查看当前用户
依赖包创建和发布
搭建好了 npm 私服,我们就可以上传 npm 包了,我们来创建一个最简单的 NPM 包项目,目录如下:
privative-npm
├── .gitignore // 相应目录,发布时会忽略上传
├── .npmignore // 同理,会忽略上传
├── index.js // 作为入口
├── package.json // 包描述文件
└── README.md // 项目说明
首先通过 npm init 初始化 package.json,然后我们可以对包的信息进行一些修改:
// package.json
{
"name": "gn-test", // 必需,不能有大写字母、空格、下划线
"version": "1.0.0", // 必需,请严格遵循语义化
"description": "Test only, not published to NPM.",
"author": "guniao",
"license": "MIT",
"type": "module",
"main": "./index.js"
}
一个 NPM 包,其中 name 和 version 是必需的,其他都可以省略,而且 name 不能与平台上已有包重名。
由于演示而已,我们就只导出一个方法吧。注意,若在 node 下运行此包,我们使用了 ESM,因此需要在 package.json
设置 “type”: “module”
。
// index.js
export default function log(str) {
console.log(str)
}
然后我们登录上面注册的用户,输入用户名、密码以及邮箱等:
# 登录账号
npm login
也可以通过 npm logout
退出登录,以及 npm who am i 查看当前登录的用户名。
登录成功后就可以将我们的包进行发布了,在创建的 npm 的包根目录下,打开 cmd 窗口,执行 npm publish,或可在 package.json 脚本命令中定义(后者更合适),以下是发布成功的界面
# 发布依赖包
> 先切换 npm 的镜像源到 私服地址,然后`npm login`登录,在进行后续操作
npm publish
使用依赖包
先切换 npm 的镜像源到 私服地址,然后
npm login
登录,在进行后续操作
当前 npm 的镜像源要是存放 npm 私服的地址,不然无法获取到自定义包。如果私服中没有要下载的包,会自动从外服中下载。
注意:不能在当前 npm 包下 测试!
// 下载
npm i gn-test
// vue 使用 npm 包
<template>
<div>111</div>
</template>
<script>
import gnTset from 'gn-test'
export default {
created() {
gnTset(111)
}
}
</script>
<style></style>
更新依赖包
先切换 npm 的镜像源到 私服地址,然后登录,在进行后续操作
如果我们要更新包,其中版本号 version 一定要修改,否则会更新失败,如下:

这里我就只改个版本号吧,更新包的命令仍然是 npm publish ,上传成功后,刷新页面可以看到新版本了。
删除依赖包
先切换 npm 的镜像源到 私服地址,然后
npm login
登录,在进行后续操作
# 撤销包的某个版本
$ npm unpublish [<@scope>/]<pkg>@<version>
# 撤销包
$ npm unpublish [<@scope>/]<pkg>
# 强制撤销
$ npm unpublish [<@scope>/]<pkg> --force