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