0%

使用verdaccio搭建私有npm仓库

背景

  • 公司内部开发的私有包,统一管理,方便开发和使用,尤其版本管理需要统一;
  • 安全性,既要保证组件的使用方便也要保证组件的私有性。

介绍

为什么选择 verdaccio? 免费

市面上付费的软件大概有下面几种:

  • 付费选择:MyGet (www.myget.org) 团队版 40 美元/月,且只能有五个账号和 2GB 的存储空间。
  • NPM Org (www.npmjs.com) 每个账号每月 7 美元付费的我们就不考虑了,没这个必要,而且付费的也不是就更好。

sinopia 搭建十分简单友好,不过这玩意儿已经停止维护了,最近的更新在几年前,但有一群人出了 sinopia 的一个分支,起了个名字叫 verdaccio,这个就是这次主要推荐的方案,这个库一直在积极维护中,github start 13000+,看来还是比较靠谱的,而且国内外各种资料参考下来,这个方案也是受到极力推荐的。

安装

详细的安装教程。如果是本地安装, 可以使用 npm、yarn 或 pnpm 全局安装即可。

1
2
3
4
5
npm install --g verdaccio

yarn global add verdaccio

pnpm install -g verdaccio

运行

在命令行执行下方命令

1
verdaccio

启动后会输出配置文件地址和浏览器访问地址

1
2
warn --- config file  - xxx/xxx/config.yaml
warn --- http address - http://localhost:4873/ - verdaccio/5.14.0

使用

nrm

nrm 是一个 NPM 源管理器,可以使用 nrm 在不同的源切换。

  • 安装 nrm
1
npm install -g nrm
  • 查看源
1
nrm ls
1
2
3
4
5
6
7
  npm ---------- https://registry.npmjs.org/
yarn --------- https://registry.yarnpkg.com/
tencent ------ https://mirrors.cloud.tencent.com/npm/
cnpm --------- https://r.cnpmjs.org/
taobao ------- https://registry.npmmirror.com/
npmMirror ---- https://skimdb.npmjs.com/registry/
* fc ----------- http://localhost:4873/
  • 添加或删除私有源
1
2
3

nrm add registry_name registry_url #添加源,registry_name为源的名称,registry_url为源的地址
nrm del registry_name #删除源
  • 使用私有源
1
nrm use registry_name

登录私有源

  • 添加用户
1
npm adduser
  • 登录
1
npm login

发布包

在项目的根目录下执行 npm publish 就可以将包发布到私有源

1
npm publish

权限管理

权限配置

一般团队或者公司的私有项目,会采用不同的权限控制,配置文件的 packages 是配置包的权限的

  • 匹配包名
    • ‘@/‘ 表示带有@/的作用域包
    • ** 表示其他的所有包
    • 可以配置自己的包比如:’private-‘, ‘my-‘等等
  • 操作权限
    • access 表示哪一类用户可以对匹配的项目进行安装(install)
    • publish 表示哪一类用户可以对匹配的项目进行发布(publish)
    • proxy 表示如果库中没有此包,此能过上面配置的 npmjs 去获取
  • 用户权限:
    • $all 表示所有人都可以执行对应的操作
    • $authenticated 表示只有通过验证的人可以执行对应操作
    • $anonymous 表示只有匿名者可以进行对应操作(通常无用)
    • 这里可以写已经注册的用户名,做到精细化控制

实际配置场景

公司里有两个前端团队 teamA 和 teamB,私有源上的所有包都可以安装,但是每个团队只能发布或移除自己团队的包。则可以使用以下配置。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# config.yaml
packages:
# teamA
'@teamA/*':
access: $all
publish: teamA-user1 teamA-user2 teamA-user3
unpublish: teamA-user1 teamA-user2 teamA-user3
proxy: npmjs
# teamB
'@teamB/*':
access: $all
publish: teamB-user1 teamB-user2 teamB-user3
unpublish: teamB-user1 teamB-user2 teamB-user3
proxy: npmjs
# 其他所有包
'**':
access: $all
publish: $authenticated
unpublish: $authenticated
proxy: npmjs

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

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

1
2
auth:
max_users: -1

如果需要添加用户这里介绍两种方法:

  • 可以通过安装 htpasswd-for-sinopia 来添加账号
1
2
npm install htpasswd-for-sinopia -g #全局安装htpasswd-for-sinopia
sinopia-adduser # 在 htpasswd 目录下执行
  • 可以通过官方提供的工具来生成 htpasswd-generator ,将生成的段字符串添加到 htpasswd 中即可。