概述
随着我们技术的积累,在工作和学习中时常会写一些复用的工具,我们想分享给公司其它同事使用或者公司可能会有一个公共组件仓库,但这些工具或者组件都涉及公司内部的机密,公司出于自身隐私保护需要,不想把自己的代码开源到包管理区,但是又急需一套完整包管工具,来管理越来越多的组件、模块和项目。对于前端,我们最熟悉的莫过于 npm,bower 等;但是 bower 的市场兼容性明显没有 npm 强壮,加之 commonjs 规范的日益成熟。npm 应该是前端包管理的不二选择。这时我们就可以搭建一个 npm 私服,只在公司局域网访问,我们可以将我们写好的工具发布到上面,方便其它同事安装使用。当访问到本地 npm 没有的时,verdaccio 会根据设置的远程仓库路径下载(远程仓库可以通过配置文件修改),之后将下载完成的包缓存到本地,当下一次安装同样的包时就可以直接从本地缓存获取了。
私服工作要求
- 可以不用向npm付费,而且东西放在别人服务器上相对没有自己电脑安全;
- 私有包托管在内部服务器中,只在内部使用,并且还想可以配置相应的权限;
- 项目中使用了公共仓库上的公共包,也使用了内部服务器上的私有包;
- 下载时,公共包走公共仓库,私有包走内部服务器的私有仓库;
- 服务器硬盘有限,希望只缓存下载过的包,而不是全部同步;
- 对于下载,发布 npm 包有对应的权限管理,安装方便,配置简单,依赖少;
- npm 上的包下载很慢,把已经下载过的包缓存在服务器上,下次下载时首先检查更新,如果没更新直接走缓存;
- 比git方便,也符合大家的习惯;
常用搭建工具
工具名称 | 说明 |
nexus | nexus 功能强大,但是部署和配置较繁琐 |
cnpm | cnpm 虽然比 nexus 配置简单,但是也需要使用到 mysql |
verdaccio | verdaccio 使用文件存储包数据,无需安装数据库并且部署简单,只需要一行代码就可以部署完成 |
sinopia | sinopia 不维护了 |
工作原理
Verdaccio 搭建私有 NPM
简介
Verdaccio 是一个简单的零配置的node.js轻量私有的npm代理仓库 (npm proxy registry), forked 于 sinopia@1.4.0
。是几个意大利籍的巴西程序员,基于Sinopia开发的轻量级npm代理源。
特点
- 与 yarn, npm 和 pnpm 100% 兼容
- 开源免费、稳定
- 提供 Docker 和 Kubernetes 支持,相当容易安装和使用
- 发布的包是私有的并且访问权限可配置
- Verdaccio 按需要缓存所有相关项,并在当地或私有网络下可以加速安装
- 缓存npmjs.org仓库,使用组件时,通过内网下载更快
- 私有仓库
- 链接多个仓库
- 覆盖公共软件包
- 端到端测试
- 有利于技术、知识的沉淀
环境
- node
verdaccio@3.x Node >= v6.12
|verdaccio@4.x Node >= v8.x
- npm 官方强烈推荐包管理器版本
> npm@5.x | yarn@1.x | pnpm@2.x
- verdaccio
- pm2
- nrm
- web 应用支持浏览器
Chrome, Firefox, Edge 和 IE11 browsers以上
安装
1. node安装
Node.js是一个基于 Chrome V8 引擎的 JavaScript 运行环境,这样JavaScript 的运行可以不用依赖浏览器。
配置node 环境变量
- 查看nodejs全局安装路径:
npm config ls
其中 prefix 的路径就是 nodejs全局安装路径。 - 将 nodejs全局安装路径 配置到环境变量中即可。
2. npm安装
NPM是JavaScript的包管理工具。安装Node.js后,已包含了NPM。
3. verdaccio安装
注:Verdaccio 支持多种安装方式,甚至包含charts包
安装有可以docker、也可以npm|yarn,我们使用npm安装(以管理员身份运行)
$ npm install -g verdaccio --unsafe-perm or $ yarn global add verdaccio --unsafe-perm
这时候完成后可能会提示木有python环境,可以忽略。
4. pm2安装
1. 命令行安装
$ npm install -g pm2 或者 $ yarn global add pm2
5. nrm安装
1. 命令行安装
$ npm install nrm -g 或者 $ yarn global add nrm
2. 配置环境变量
- 查看nodejs全局安装路径:
npm config ls
其中 prefix 的路径就是 nodejs全局安装路径。 - 将 nodejs全局安装路径 配置到环境变量中即可。新建一个变量(“NRM_PATH”),路径为 nodejs全局安装路径(我这里值为“D:\Program Files\nodejs\node_global”)。
- 将 刚刚创建的环境变量,添加到 系统 path 路径中(%NRM_PATH%) 。
- 至此重启cmd,配置生效。
启动
$ verdaccio
启动后会出现配置文件路径,及访问的链接
warn --- config file - /root/.config/verdaccio/config.yaml warn --- Plugin successfully loaded: htpasswd warn --- Plugin successfully loaded: audit warn --- http address - http://localhost:4873/ - verdaccio/
配置
1. 修改
CentOS: 修改配置文件,在/root/.config/verdaccio/config.yaml
Windows: $ vim C:\Users\admin\AppData\Roaming\verdaccio\config.yaml
里末尾添加
listen: 0.0.0.0:4873
注意: 请保证4873端口可访问,避免防火墙拦截
2. 权限配置
在当前用户的 .config/verdaccio
下默认有两个文件:config.yaml
和 htpasswd
。这里介绍两个比较重要的配置项,其他的可以官网上查询。
一般团队或者公司的私有项目,会采用不同的权限控制。
操作权限:
access
表示哪一类用户可以对匹配的项目进行安装(install)publish
表示哪一类用户可以对匹配的项目进行发布(publish)proxy
如其名,这里的值是对应于 uplinks 的
组权限:
$all
表示所有人都可以执行对应的操作$authenticated
表示只有通过验证的人可以执行对应操作$anonymous
表示只有匿名者可以进行对应操作(通常无用)
代码如下:
packages: # scoped 包 '@scope/*': access: $all publish: $all proxy: server2 'supersecret-*': # 添加多个组 access: secret super-secret-area ultra-secret-area publish: secret ultra-secret-area proxy: server1 'private-*': # private-xxx 允许所有的用户安装、认证的用户发布 access: $all publish: $authenticated proxy: uplink1 'old-*': # 不设置 `access`、`publish` 阻止对一组包的访问(不设置proxy阻止代理一组特定包) '**': # 允许所有用户 (包括为验证的用户) 安装和发布 access: $all publish: $all proxy: uplink2
3. 权限配置
因为是私有源,我们可以设置 config.yaml 中的 max_users: -1 来禁用 npm adduser 命令来创建用户。如果需要添加用户这里介绍两种方法:
- 可以通过安装 htpasswd-for-sinopia 来添加账号
$ npm install htpasswd-for-sinopia -g $ sinopia-adduser # 在 htpasswd 目录下执行
- verdaccio 的认证是基于 verdaccio-htpasswd, 可以通过官方提供的工具来生成 www.htaccesstools.com/htpasswd-ge…,将生成的段字符串添加到
htpasswd
中即可。
部署
1. 使用pm2启动常驻后台
$ pm2 start verdaccion 复制代码
注意:verdaccion
不支持pm2
的cluster
方式,如果这种方式启动会出现未知的异常
访问
在浏览器中打开xx.xx.xx.xx:4873,如果能正常访问则说明搭建成功了
切换nrm源
1. 添加npm源
$ nrm add 新源名称 http://xx.xx.xx.xx:4873 复制代码
2. 查看npm源
$ nrm ls 复制代码
3. 使用npm源
$ nrm use 新源名称
发布私有包
$ npm adduser --registry http://xx.xx.xx.xx:4873 $ npm login --registry http://xx.xx.xx.xx:4873 $ npm publish --registry http://xx.xx.xx.xx:4873 $ npm profile set password --registry http://xx.xx.xx.xx:4873
安装发布的npm包
方法一
$ npm set registry http://xx.xx.xx.xx:4873 $ npm install <你的包名>
方法二
$ npm install <你的包名> --registry=http://http://xx.xx.xx.xx:4873