乐趣区

关于javascript:使用-verdaccio-搭建私有的-npm-registry

前言

verdaccio 是一款开源用于创立公有 registry 的工具, 简略来说你能够用它来搭建一个本人的 npm 仓库, 能够实现绝大部分 npm 所提供的能力.

verdaccio 基于 node 开发, 对于前端开发人员来说获取 verdaccio 这款工具就像喝水一样简略.

工具的诞生往往是依据需要而呈现的, 当你想要分享你的模块时候, 你可能会有如下的想法.

  • 我心愿我的外部模块不会对外公开

    • verdaccio 就是为部分托管而生, 这是它的本职工作
  • 我像要疾速, 平安的模块托管体验

    • 在内网部署的 verdaccio 毫无疑问很平安, 而且他还会主动缓存模块, 相当于给全局加了一层缓存而后在于内网的速度联合 absolutely
  • 我想组织团队间的代码

    • 通过 npm cli 的提供的 scoped 性能或者通过 verdaccio 的权限管制你都能够轻松的协调和组织不同我的项目间的模块
  • 我想对模块增加权限访问控制

    • 当然没有问题, 你能够管制模块的拜访 推送 和 移除三大权限, 通过用户名称的模式

最初 verdaccio 还会提供一个 GUI 尽管性能没有像 npmjs.org 那样弱小, 然而提供了最最实用的性能.

配置 verdaccio

应用 npm 或者 yarn 等工具间接装置就是了:

npm install -g verdaccio
// 或者对于 yarn
yarn global add verdaccio

如果你没有非凡需要, 间接通过全局装置. 想要理解装置前置要求, 或者其余装置形式? 为了本篇文章的简洁请移步官网文档

启动 verdaccio

不须要任何启动配置, 间接在命令行中输出:

verdaccio

???? 你曾经有了本人的公有仓库, 怎么是不是很简略.

当然不传入和任何参数的状况下 verdaccio 会应用默认的配置, 当然咱们也能够手动的为其指定配置文件.

你能够间接关上浏览器返回默认的 locahost:4873 体验 GUI 或者持续前面的教程, 所以如果你的 4873 端口被占用也是不要紧的.

配置文件门路

晓得了配置文件的门路, 心中才会虚浮, 最简略的形式就是在执行 verdaccio 命令后查看终端的首行输入:

第一行就是配置文件的地址.

官网配置文件地址文档

第一个公有包

上传一个模块总共分为 3 步骤:

  1. 搞到一个 npm 模块
  2. 登入到要上传的 registry
  3. 在我的项目下执行 npm publish

创立一个 npm 模块

轻易关上一个目录而后执行, 让这个目录变为一个 npm 模块:

npm init -y

而后增加一个 index.js , 内容随便例如:

export function echo () {console.log('hello world!');
}

登入到 registry

registry 就是模块集中注册的中央, npm cli 默认的注册处是 https://registry.npmjs.org/ , 如果你在国内你的地址很可能曾经换成了淘宝源那么这个地址会有所差异.

能够执行上面的命令来能够察看默认 npm cli 的配置:

npm config list

咱们所要做的是设置 registry 为咱们本地的 verdaccio 服务:

npm set registry http://localhost:4873/

很多人对于合乎 npm 规定的 registry 的工作形式不太熟悉, 这里简略的阐明一下, 想要推送一个模块除了指定一个你想推送的 registry, 还须要通过 npm cli 工具借助于交互式命令登陆到这个 registry, 而后才能够推送.

对于默认的 https://npmjs.org/ 你须要在该网站上注册一个账号, 而后再在本地登陆, 对于 verdaccio 你不须要注册, 在你通过命令行登陆的时候如果这个用户不存在则间接创立一个新的账户.

当初咱们通过交互式命令增加一个新的账户:

npm adduser

推送模块到 registry

好了执行上面的代码来进行推送吧:

npm publish

当初返回 http://localhost:4873/ 你的首个模块曾经推送实现啦!

第一个作用域模块

作用域模块简介

作用域模块(scoped module) 简略来将就是命名空间, 对于 https://npmjs.org/ 上的每一个用户或者组织它们的账户 / 组织名都是惟一的, 将它们的账户作为命名空间这样一来这个账户下的模块名称就能够现有的公开模块重名.

例如我有一个 example 的账户, 我想推送一个我本人批改后的 react 模块, 显然这和现有的模块重名了, 因为曾经存在一个公开的 react 模块, 那么我就能够将他设置为作用域模块, 名称就成为了 @example/react. 是不是有点相熟? @vue/cli@bable/core 就是作用域模块.

另外如果你应用过 docker 用于镜像托管的 https://hub.docker.com/ 上的镜像名称与 npm 的作用域模块名称有着类似的设计.

作用域模块的特点

  1. 不同作用域下的模块能够重名
  2. 能够为 registry 关联作用域
  3. 作用域专用的模块名 @作用域 / 模块名称

如果咱们存在多个团队, 不同团队外部领有本人的公有 npm 托管, 如果须要模块相互借用, 可能会呈现模块名称抵触的问题. 利用作用域模块咱们能够将批改模块命名为 @团队名称 / 模块名称 或者 @项目名称 / 模块名称.

另外将 registry 与作用域模块关联后, 对于公开模块 (不被 verdaccio 治理的模块) 的下载, 流量就不会通过 verdaccio 当然这是不须要应用 verdaccio 缓存的状况下, 这些内容咱们前面的章节会提到.

两种设置作用域的形式

有两种次要的设置作用域模块的路径:

  1. 给现有的模块增加作用域
npm init --scope <scope name>
  1. 登陆 registry 并为其配置作用域和地址
npm adduser --registry=<registry> --scope=<scope name>

当下载和推送模块的时候只有作用域匹配, 那么会下载和推送到该 registry 下来.

实际一下, 咱们当初重置 npm 到初始状态:

// 重置默认 registry
npm set registry https://registry.npmjs.org/

// 勾销登陆状态
npm logout

进入到我的项目目录通过为其创立一个 example 作用域:

// 该命令会重写以后的 package.json, 同时也是交互式命令, 一路回车即可
npm init --scope example

而后登陆到 http://localhost:4873 同时指定作用域:

// 第二次登陆如果用的是之前的账号, 明码则必须和之前一样
npm adduser --registry=http://localhost:4873 --scope=example

而后推送模块:

npm publish

在持续之前这里涉猎一些一些 npm 与 verdaccio 在包访问控制上的一些区别, 一个作用域模块默认不会被公开根本等同于作者可见, 也就是 npm 在模块上增加了访问控制.

然而 verdaccio 去掉了无关访问控制的合乎 npm 的实现, 基于 npm access 的命令无奈应用, 配置模块拜访则须要批改配置文件.

如果你心愿你的 npm 模块可见在推送时候能够指定如下的命令:

npm publish --access=public

如果这个模块曾经被提交则须要应用来批改:

npm access public

https://docs.npmjs.com/cli/v7…

回到 verdaccio 这边, 默认的配置中任何人都能够拜访作用域模块, 所以进入到 GUI 你就能够看到这个模块了:

配置文件的应用形式在前面的章节中会介绍.

好了通过下列命令就能够从咱们指定的 registry 上装置咱们的作用域模块:

npm install @example/verdaccio-example

试想一下如果存在多个开发项目组, 如果所有的模块都基于 @项目名称 / 模块 名称的模式, 不同我的项目间的援用模块将会轻松的多.

配置文件入门

简介

之前咱们曾经提交如何寻找默认配置文件的地位, 这里不在赘述.

官网文档 - 配置文件

verdaccio 的配置文件并不简单, 本章节只会挑重点介绍, 否则就成为翻译文档了, 所以不要遗记去文档中浏览其余的性能配置.

设置模块

默认配置文件的包访问控制如下:

packages:
  # 能够应用通配符来匹配包名, 这个条件匹配的是作用域模块
  '@*/*':
    # 拜访权限, 根本等用于是否能够被搜寻到
    access: $all
    # 托送权限
    publish: $authenticated
    # 代理配置, 在模块缓存一节中会介绍
    proxy: npmjs
  # 这个条件匹配所有模块
  '**':
    proxy: npmjs

除了 access publishproxy 还有一个 storage 选项用于管制匹配模块的绝对于存储目录的门路.

说实话我对这些权限组概念无奈了解, 为了不带来谬误的信息, 这里只给出具体的用法, 想要深刻理解的能够去看官网文档.

可用的内置权限组如下:

'$all', '$anonymous', '@all', '@anonymous', 'all', 'undefined', 'anonymous', $authenticated
  • $all 示意全副用户
  • $anonymous 排除登陆用户
  • $authenticated 示意登陆用户

已注册用户名能够用于权限管制, 通过这种形式能够进行更加精密的操作:

packages:
  'npmuser-*':
    access: npmuser
    publish: npmuser

下面这份配置只有合乎 npmuser-* 规定的模块, 只有账号为 npmuser 的用户才领有权限.

用户管制

设置多个用户组

  'company-*':
    access: admin internal
    publish: admin
    proxy: server1
  'supersecret-*':
    access: secret super-secret-area ultra-secret-area
    publish: secret ultra-secret-area
    proxy: server1

禁用一组模块

packages:
  'old-*':
  # 不定义 access 和 publish 即可
  '**':
    access: $all
    publish: $authenticated

禁止模块代理到其余 registry

留神: proxy 的用法在下一节形容

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. 容许任何人读取和托送保留在本地的 jquery 模块, 然而只有 root 用户才能够移除它
  2. my-company-* 模块只容许所有人拜访, 只有登陆后的才能够推送, 然而不容许移除这个模块
  3. @my-local-scope/* 模块容许所有人拜访, 只有登陆后的人才能够推送, 推送的人有权限移除它
  4. 其余的模块容许所有人拜访, 只有登陆后才能够推送

批量创立账号密码

我本人并没有尝试批量创立用户, 然而这是可行的. 默认的访问控制基于 htpasswd 注册的用户被保留到了 htpasswd 文件中. 这个文件和配置文件保留在同一个目录中.

关上该文件后你能够看到如下的文本, 这些是我通过 verdaccio 登陆后所创立的, 基本上就是 用户名 + 明码哈希 + 创立类型 + 日期, 其中只有账号和明码哈希是必要的.

admin:Veu47j6NfSujQ:autocreated 2021-02-05T08:08:22.684Z
example:x01Ba3hJe4d2c:autocreated 2021-02-24T15:13:27.132Z
teama:GV.PRNbm5rgi6:autocreated 2021-02-24T15:59:20.618Z

htpasswd 仓库简略的介绍了这个文件:

The htpasswd file contains rows corresponding to a pair of username and password separated with a colon character. The password is encrypted using the UNIX system’s crypt method and may use MD5 or SHA1.

另外你能够用这个网站 (需翻墙) 来在线创立.

https://hostingcanada.org/htp…

然而想要批量创立可能须要写个脚本.

模块代理与缓存

模块代理

如果全局 registry 设置为了 verdaccio 如果咱们下载一个不存在于 verdaccio 上的模块, verdaccio 会读取上一级的 registry 默认就是 https://registry.npmjs.org/.

在配置文件中咱们能够通过 uplinks 申明多个上游:

uplinks:
  npmjs:
   url: https://registry.npmjs.org/
  server2:
    url: http://mirror.local.net/
    timeout: 100ms
  server3:
    url: http://mirror2.local.net:9000/
  uplink1:
    url: http://localhost:55666/

申明好的上游用于 packages.proxy 选项:

packages:
  '@scope/*':
    access: $all
    publish: $all
    proxy: server2
  'private-*':
    access: $all
    publish: $all
    proxy: uplink1
  '**':
    access: $all
    publish: $all
    proxy: npmjs

下面这份配置中如果合乎模块名称匹配规定的模块不存在本地服务上对于:

  • @scope/* 会向 server2 也就是 http://mirror.local.net/ 查问
  • private-* 会向 uplink1 也就是 http://localhost:55666/ 查问
  • 其余的模块则会向 npmjs 也就是 https://registry.npmjs.org/ 查问

当然默认的 npmjs 能够指向 https://registry.npm.taobao.org 对于国内的网络环境更加敌对.

模块缓存

verdaccio 默认会缓存上游下载下的模块, 这是非常有意义的, 一般来说反复下载同一个模块的几率要比下载一个新的模块几率高得多.

无关缓存的配置我的项目不多, 次要集中在 uplinks 选项上:

uplinks:
  npmjs:
   # 示意是否开启缓存
   cache:true
   # 示意缓存多久后生效
   maxage:10m
   url: https://registry.npmjs.org/

官网文档地址 https://verdaccio.org/docs/en…

退出移动版