Verdaccio npm 私服配置总结

前言

npm 私服,我想是每个团队都会实践经历的一个阶段。实现私有 npm 的方式有很多,例如 nexusNPM OrgVerdaccio 等。综合对比下来, Verdaccio 配置简单,易上手,是目前(2021年)极力推荐的私服搭建工具。

Verdaccio 是什么?

官网:https://verdaccio.org/zh-cn/

Verdaccio 是一个 Node.js创建的轻量的私有npm proxy registry

安装、启动

Verdaccio 的安装启动过程较为简单。首先是全局安装 Verdaccio

npm install -g verdaccio

然后,在终端输入 verdaccio 命令启动:

verdaccio

接着 Verdaccio 会在终端中输出提示,输出它的配置文件位置、启动的服务地址等信息:

image-20210807171219543

默认 Verdaccio 启动的服务都会在 4873 这个端口,在浏览器中打开这个地址我们就会看到 Verdaccio 搭建的私有库 npm 的界面:

image-20210807171343344

可以看到,默认的界面风格还是很简洁、美观的。并且,这里会提示我们要登陆、发布 npm 包需要执行的命令。

配置修改

虽然,安装和启动好了 Verdaccio。但是,由于 Verdaccio 默认的配置和我们生产的需求不一致,所以我们需要修改一下 Verdaccio 的配置。 Verdaccio 的配置文件是在 ~/.config/Verdaccio 文件夹的 config.yaml 文件,默认的配置移除注释后会是这样:

storage: ./storage
plugins: ./plugins
web:
  title: Verdaccio
auth:
  htpasswd:
    file: ./htpasswd
uplinks:
  npmjs:
    url: https://registry.npmjs.org/
packages:
  '@*/*':
    access: $all
    publish: $authenticated
    unpublish: $authenticated
    proxy: npmjs
  '**':
    access: $all
    publish: $authenticated
    unpublish: $authenticated
    proxy: npmjs
server:
  keepAliveTimeout: 60
middlewares:
  audit:
    enabled: true
logs:
  - { type: stdout, format: pretty, level: http }

这里我们来逐个认识一下默认配置中的几个值的含义:

  • storage 已发布的包的存储位置,默认存储在 ~/.config/Verdaccio/ 文件夹下
  • plugins 插件所在的目录
  • web 界面相关的配置
  • auth 用户相关,例如注册、鉴权插件(默认使用的是 htpasswd
  • uplinks 用于提供对外部包的访问,例如访问 npm、cnpm 对应的源
  • packages 用于配置发布包、删除包、查看包的权限
  • server 私有库服务端相关的配置
  • middlewares 中间件相关配置,默认会引入 auit 中间件,来支持 npm audit 命令
  • logs 终端输出的信息的配置

中文配置

Verdaccio 默认语言是英文,配置中文只需要进行如下修改:

# translate your registry, api i18n not available yet
i18n:
# list of the available translations https://github.com/verdaccio/ui/tree/master/i18n/translations
   web: zh-CN

权限控制

权限控制指的是我们需要私有 npm 库上发布的包只能团队成员查看,除此之外人员不能看到一切信息。那么,回到 Verdaccio,我们需要做这 2 件事:

  • 限制 npm 包的查看,只能为已注册的用户
  • 禁止用户注册(在团队成员已注册完成后)

相应地,这里我们需要修改配置文件的 pacakgesauth。前面我们也提及了 packages 是用于配置发布包、查看包、删除包相关的权限。我们先再来看看默认的配置:

packages:
  '@*/*':
    access: $all
    publish: $authenticated
    unpublish: $authenticated
    proxy: npmjs
  '**':
    access: $all
    publish: $authenticated
    unpublish: $authenticated
    proxy: npmjs

这里的 key 代表对应权限需要匹配的包名,例如对于第一个,如果我们发布的包名是这样的 @wjc/test 就会命中。每个规则中对应 4 个参数。其中 proxy 代表如果在私有 npm 库找不到,则会代理到 npmjs(对应 unlinks 中的 npmjshttps://registry.npmjs.org/)。而剩下的 3 个参数,都是用来设置包相关的权限,它有三个可选值 $all(所有人)、$anonymous(未注册用户)、$authenticated(注册用户)。那么,下面我们分别看一下这 3 个参数的含义:

  • access 控制包的访问权限
  • publish 控制包的发布权限
  • unpublish 控制包的删除权限

显然,这里我们需要的是只有用户才能具备上述 3 个权限,即都设置为 $authenticated

packages:
  '@*/*':
    access: $authenticated
    publish: $authenticated
    unpublish: $authenticated
    proxy: npmjs
  '**':
    access: $authenticated
    publish: $authenticated
    unpublish: $authenticated
    proxy: npmjs

设置好 packages 后,我们还得更改 auth 的值,因为此时注册用户是没有限制的,也就是说如果你的私有 npm 库部署在外网环境的话,任何人都可以通过 npm adduser 命令注册用户。

显然,这是不允许出现的情况,所以这里我们需要设置 authmax_users-1,它代表的是禁用注册用户:

auth:
  max_users: -1

如果要开启用户注册,设置指定数字(大于 0)即可

上游链配置

Verdaccio 默认 uplinks 只有一个 npmjs,我们一般会使用 yarntaobao等镜像地址,配置如下:

uplinks:
  npmjs:
    url: https://registry.npmjs.org/
  taobao:
    url: https://registry.npm.taobao.org/

然后修改 packages 中的 proxy为指定的地址即可。更多配置可参考Verdaccio Uplinks 文档

基本使用

既然配置好了 Verdaccio。那么,我们就可以开始发布第一个私有包了 😎。

注册用户

首先,我们需要注册一个用户

npm adduser --registry http://localhost:4873/

接着,它会要求你填写用户名、密码和邮箱,用于登陆私有 npm 库。

删除用户

既然有注册用户,不可避免的需求是在一些场景下,我们需要删除某个用户来禁止其登陆私有 npm 库。

前面也提及了 Verdaccio 默认使用的是 htpasswd 来实现鉴权。相应地,注册的用户信息会存储在 ~/.config/verdaccio/htpasswd 文件中。在该文件中一条记录对应一个用户,也就是如果这条记录被删除了,那么该用户就不能登陆了,即删除了该用户。

添加、切换源

这里我们为了操作方面,通过 yrm 来切换源。yrm 可以同时管理 npmyarn 的源,没有安装 yrm 的同学,可以先安装一下:

npm install -g yrm

然后,使用 yrm 添加一个源:

yrm add test http://localhostm:4873/

这里的 test 代表你这个源的简称,你可以因自己的喜好来命名。

然后,切换源:

yrm use test

切换好源后,我们之后的 npm i 就会先去私有库查找包,如果不存在则会去 https://registry.npm.taobao.org/(因为上面配置了 proxy)查找包。

注意 yarn 安装项目依赖还需要修改 .npmrc文件,添加:

//localhost:4873/:always-auth=true

发布包

发布的话就直接在某个需要发布包的项目(假设这里我们的包叫 wkl-vue-ui)的根目录下运行:

npm publish

然后,在私有 npm 库的界面上就可以看到我们发布的包:

image-20210807174858972

结语

当然,Verdaccio 能做的还有很多,例如集成 Git Action 自动发包、自定义鉴权插件等。但是,经过我们上面的一番折腾,私有 npm 库已经初具规模可以投入生产使用了🤗。最后,文章中如果存在表达不当或错误的地方,请大家多多在评论区留言。

参考文献:

### 解决 Verdaccio 添加 npm 用户时卡住的问题 当遇到 Verdaccio 的 `npm adduser` 或者 `npm login` 卡住的情况,通常是因为配置不正确或者是网络连接问题。以下是详细的解决方案: #### 配置本地环境 确保已经正确安装并启动了 Verdaccio 私服。可以通过命令行来验证 Verdaccio 是否正常运行。 ```bash verdaccio --listen 4873 & ``` 这会使得 Verdaccio 在后台监听端口 4873[^2]。 #### 设置 NPM 注册表指向 Verdaccio 为了使所有的 npm 操作都通过 Verdaccio 进行,需要设置 npm 客户端的注册表地址为 Verdaccio 地址。 ```bash npm set registry http://localhost:4873/ ``` 此操作将改变默认的公共 npm 注册表至本地 Verdaccio 实例[^4]。 #### 执行用户认证流程 如果之前尝试过 `npm adduser` 并遇到了冲突错误 (E409),可能是因为淘宝镜像或其他原因引起的。建议先清除现有的凭证缓存再重试。 ```bash npm logout ``` 之后可以再次执行添加用户的指令: ```bash npm adduser Username: your_username Password: your_password Email: (this IS public) your_email@example.com ``` 对于某些情况下可能会因为代理服务器或者其他因素造成请求超时或挂起,则可以在 `.npmrc` 文件中指定更短的时间间隔以加快失败检测速度。 ```ini fetch-retry-mintimeout=1000 fetch-retry-maxtimeout=5000 ``` 另外一种方法是直接使用 `npm login` 来代替 `npm adduser` ,两者功能相似但是实现方式略有不同,有时能绕过特定场景下的 bug[^3]。 #### 测试发布权限 完成上述步骤后应该能够成功创建账户并且获得必要的权限去上传自己的包。测试是否具备发布的权利可通过简单的 Hello World 包来进行。 ```javascript // package.json { "name": "@your_scope/hello-world", "version": "1.0.0" } ``` 接着打包并推送这个小型项目到 Verdaccio 上面查看是否有任何异常反馈信息。 ```bash npm publish --registry=http://localhost:4873/ ``` 以上措施有助于排除大多数由于配置不当所引发的问题,并帮助顺利完成 Verdaccio 中的新用户注册过程以及后续的操作需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小黑ii

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值