Skip to content

企业私有 NPM 搭建及使用

NPM 是日常前端开发过程中离不开的包管理工具,可以帮助我们快速安装 NPM 仓库中优秀的第三方代码包,它的出现极大地促进了 Node 及前端生态的发展繁荣。

在日常工作中,大多数时候我们会使用 NPM 共有仓库中的优秀开源代码包,但还是会有一些不能够开源的代码封装和工具,或者对第三方的开源代码做定制化修改和扩展,这些代码包需要在组织内部进行管理和共享,不能够上传到 NPM 共有仓库中。

同时由于公司业务线的慢慢增加,不同团队依赖的公共东西也在慢慢增加。有时候更新一个 SDK/公共组件,得通知各方人员,并把对应更新好的 SDK/公共组件发送给他们。让他们添加在项目中,然后发布新版发布到线上。其实是增加了一定程度的风险。

最后,搭建自己的私有仓库同时还能够提升 NPM 包的安装下载速度和源的稳定性,比如大家常用的淘宝镜像源,本质上也是私有仓库。公司搭建自己的 NPM 仓库,就可以为自己的员工提供更快速稳定的工具包共享下载平台。

因此,我们需要私有 NPM 来帮助我们解决以上问题。

Verdaccio

Verdaccio 是一个简单的、零配置要求的本地私有 NPM 注册中心。不需要额外数据库就能开始工作。Verdaccio 开箱即用,有自己的小型数据库,并能代理其他注册中心 (如 npmjs.org),还引入了缓存下载模块的功能。最重要就是简单,使用简单,配置简单。

安装

这里使用 Docker 安装 Verdaccio。如果不懂 Docker 可以使用 npm/yarn 运行 Verdaccio。

docker run -d \
   --name npm \
  -p 4873:4873 \
  -u root \
  --env "VERDACCIO_PUBLIC_URL=https://npm.yinchengnuo.com" \
  -v /npm/conf:/verdaccio/conf \
  -v /npm/storage:/verdaccio/storage \
  -v /npm/plugins:/verdaccio/plugins \
  verdaccio/verdaccio
1
2
3
4
5
6
7
8
9

这里使用了我的个人网站 https://npm.yinchengnuo.com 搭建了 Verdaccio。大感兴趣可以自行使用体验。

需要注意的是制定 volume 的时候我们需要在 /conf 目录下新建一个 config.yaml 文件。内容填充自 https://github.com/verdaccio/verdaccio/blob/5.x/conf/docker.yaml 。这就是 Verdaccio 的默认配置。

我们可以通过修改 config.yaml 来更新 Verdaccio 配置。

运行后我们就可以通过 https://npm.yinchengnuo.com 来访问我们搭建的私有 NPM 了。

配置管理

以 Docker 运行为例,Verdaccio 所有的配置文件都位于 /cong/config.yaml。填充了默认配置的 config.yaml 中包含了所有的 Verdaccio 配置,都使用了 # 注释。如果需要修改默认配置项目,只需要解开注释保存修改,最后重启容器即可。

用户管理

Verdaccio 的用户管理没有 Web 页面,是通过对 htpasswd 的维护来管理的。

默认情况下,以 https://npm.yinchengnuo.com 为例。

运行:

npm adduser --registry https://npm.yinchengnuo.com/
1

可以实现注册/登陆。

通常情况下我们不希望通过这种形式实现用户注册,因此我们需要关闭命令行注册,修改 config.yamlmax_users-1 即可。

因为已注册用户数据保都是存在 /storage/htpasswd 文件。因此我们可以通过修改 /storage/htpasswd 文件来管理用户。

用户名密码在 /storage/htpasswd 文件中默认以 bcrpyt 方式加密,在 /storage/htpasswd 中的形式为:

用户名:bcrpyt_encode密码 日期

例如:

张三:$2a$10$yw900/jpXbxIEpmtMXgktOfHK/pXBumI9ZxOZvKG/hapaimFhi93a 2022-08-15T08:59:54.084Z

Verdaccio 使用 bcrpyt 默认 Rounds 为 10,你可以在 https://www.bejson.com/encrypt/bcrpyt_encode/ 为明文密码加密。

除了 bcrpyt ,还可以使用 crpyt、md5 等加密方式。在 config.yaml 配置即可。/storage/htpasswd 管理方式同上。

权限管理

Verdaccio 可以配置包的访问及管理权限,默认都是公开可见的。可以通过配置 config.yaml

packages 选项。

'@*/*' 为私有包配置项,'**' 为共有包配置项,二者区别在于包 package.json 中的 privite 字段是否为 true。当然也可以使用自定义匹配批量保名,如:

packages:
  "jquery":
    access: $all
    publish: $all
    unpublish: root
  "my-company-*":
    access: $all
    publish: $authenticated
    unpublish:
  "@my-local-scope/*":
    access: $all
    publish: $authenticated
    # unpublish: property commented out
  "**":
    access: $all
    publish: $authenticated
    proxy: npmjs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

package 中每个包可以有 3 个权限配置项:accesspublishunpublish。值分别可以是:$all$anonymous$authenticated 或以空格分隔开的用户名。表示所有人可见、未登录可见、已登录可见和已登录指定人可见。

上游仓库

默认情况下安装 Verdaccio 中不存在的包时 Verdaccio 会自动前往 npmjs.org 拉取。相关配置在:

uplinks:
  npmjs:
    url: https://registry.npmjs.org/
  server2:
    url: http://mirror.local.net/
    timeout: 100ms
  server3:
    url: http://mirror2.local.net:9000/
  baduplink:
    url: http://localhost:55666/
1
2
3
4
5
6
7
8
9
10

使用时配置相关包的 proxy 选项即可。proxy 选项和 accesspublishunpublish 同级。

源管理

使用 Verdaccio 需要注意的是。无论是任何 npm 相关的操作,只要是和私有 Verdaccio 相关的,都要在命令行显式声明 --registry https://.../ 。这样显然过于麻烦,我们可以使用 .npmrc 来管理私有 Verdaccio 上的包源。

.npmrc:

registry=https://npm.yinchengnuo.com/
1

消息推送

Verdaccio 支持 webhook 方式推送发包信息(在 npm publish 的时候触发)。文档地址

推送消息到钉钉群:

# 注意缩进
notify:
  "test-dingtalk":
    method: POST
    headers: [{ "Content-Type": "application/json;charset=utf-8" }]
    endpoint: https://oapi.dingtalk.com/robot/send?access_token=xxxx
    content: '{ "msgtype": "text","at": { "isAtAll": false }, "text": {"content":"New package published: `{{ name }}{{#each versions}} v{{version}}{{/each}}`"}}'
1
2
3
4
5
6
7