有些时候我们可能会有创建私有 npm 仓库的需求,例如公司内部使用、个人创建 npm 包测试发布上传,甚至或许仅仅只是自己想的绝妙名字在公共 npm 仓库上已被占用。这种时候可以尝试使用 verdaccio 来搭建一个 npm 私有服务器。
介绍
Verdaccio 是一个由 Node.js 构建的轻量级私有 npm 代理注册源。详细信息可参考他的官方文档 Verdaccio
使用 Verdaccio 有诸多优势:
- 搭建简单,开箱即用
- 丰富的配置项满足个人定制需求
- 应用搭建在局域网内,允许个人或公开使用
- 可以对 npm 包的访问、发布、撤回配置权限管理
- 对下载过的依赖包进行缓存,以加快再次下载速度
- 与 yarn、npm 和 pnpm 100% 兼容
安装及运行
普通窗口模式
Verdaccio 的安装非常简单,两步即可启动
1 | npm i --location=global verdaccio |
启动后可以得到如下运行结果:
1 | info --- config file - C:\Users\DELL\AppData\Roaming\verdaccio\config.yaml |
运行结果中展示了两条信息:
- 配置文件位于 C:\Users\DELL\AppData\Roaming\verdaccio\config.yaml,我们之后需要修改该文件来进行自定义配置
- 服务在端口
4873
上启动,此时已经可以通过http://localhost:4873/
查看管理界面了
此时若关闭或 ctrl + C
结束进程,服务也会被一并关闭。可以考虑通过 pm2 等工具来实现后台持久运行。这里不做赘述。
Docker
处于便于管理与数据迁移,在服务器上个人更喜欢使用 Docker 部署。本文参考官方文档 Running Verdaccio using Docker
首先创建相关目录文件:
1 | # 创建根目录 |
创建一个用完就丢的容器来获取配置文件 config.yml:
1 | # 创建容器 |
创建 docker-compose.yml
文件,向其中填写如下内容
1 | version: "3.7" |
由于 Verdaccio 在容器内以非 root 用户 (uid=10001) 运行,设置了 volumes 挂载覆盖掉默认值后,涉及到到写入文件时会存在权限错误导致操作失败,此时需要确保挂载目录分配给正确的用户。
1 | # 将整个目录对 10001 用户开放 |
启动容器即可在 服务器ip:4873
看到管理后台网页了。
1 | docker-compose up -d |
使用 Verdaccio
服务开启后,我们需要将当前的 npm 源切换为我们的私人 npm 服务器地址。这里可以使用 nrm 来实现。
1 | # 全局 安装 nrm |
注册并登录 npm 账号,将会依次提示输入 username、password、email。
1 | npm adduser |
然后就可以进行 npm 的相关操作了。补充其他操作方法:
1 | # 登录用户 |
配置文件
Verdaccio 提供了丰富的配置项供我们定制化修改。建议配合官方文档食用 Configuration File。
提问:还记得配置文件在哪里吗?(笑
- 普通窗口化使用时配置文件位于启动时打印的日志信息中
- Docker 启动时则位于我们提取至的
根目录/conf
目录下
这里对部分较难理解配置项做出解释
listen
Verdaccio 默认只能本机访问,我们可以配置 0.0.0.0:端口
,公开让其他人访问。
1 | listen: |
uplinks
在安装 npm 包时,Verdaccio 会先尝试在本地查找,若找不到则会前往上游链接(uplinks)查找。
uplink 用于配置上游链接的别名和地址,允许配置多个:
1 | uplinks: |
auth
auth 配置项常用配置结构如下
1 | auth: |
verdaccio 默认使用 htpasswd 插件进行身份存储校验,这里为针对 htpasswd 的配置项
- file: 用户数据存储文件位置
- max_users: 最多注册用户数量,可设置为 -1 禁止注册
- algorithm: 校验算法。verdaccio 的默认校验算法是 crypt,这被认定是不安全的,在 v6 bcrypt 算法被默认支持之前,建议手动设置配置项使用 bcrypt 校验。
用户权限相关解释
verdaccio 内置了下面几种权限:
- $all: 全部用户
- $anonymous: 匿名用户
- $authenticated: 登录用户
而 verdaccio 默认使用的 htpasswd 插件不实现 allow_access、allow_publish 和 allow_unpublish 方法。因此其对于上面三种权限用以下方式处理:
- 当你没有登录时,$all 和 $anonymous 意义相同,均对你有效
- 当你登陆后,$all 与 $authenticated 对你有效,$anonymous 被排除在外
packages
这里为包访问相关配置,具体配置项参考官网 Package Access。这里仅做部分解释
该配置项结构如下:
1 | packages: |
其中键名的含义为:匹配包名称以 @scope/
/ private-
开头的 npm 包,当键名为 "**"
时,匹配所有 npm 包。
而 proxy 参数则指向了上面 uplinks 配置项配置的上游链接别名。
结合上文 auth 相关内容,这里的配置项解释为:包名称以 @scope/
/ private-
开头的 npm 包,所有用户均能查看(access),仅匿名用户可以发布(publish),仅登录用户可以撤回(unpublish),当在本地找到对应 npm 包时,前往别名为 taobao
的上游链接查找下载。