为什么需要搭建私有 npm
- 私有的包只想在内部使用,还不想用
git+ssh
的方式,感觉不够优雅,并且还想可以配置相应的权限 - npm 上的包下载很慢,想把已经下载过的包缓存在服务器上,下次 下载时首先检查更新,如果没更新直接走缓存
- 希望下载的时候,公共包走公共仓库,私有包走内部服务器的私有仓库
关于 Verdaccio
Verdaccio 是一个 Node.js创建的轻量的私有 npm proxy registry, forked 于 sinopia@1.4.0
。
- 与 yarn, npm 和 pnpm 100% 兼容
- 提供 Docker 和 Kubernetes 支持,相当容易安装和使用
- 发布的包是私有的并且访问权限可配置
- Verdaccio 按需要缓存所有相关项,并在当地或私有网络下可以加速安装
安装
环境
-
Node
- verdaccio@3.x
Node >= v6.12
- verdaccio@4.x
Node >= v8.x
- verdaccio@3.x
-
npm >=4.x 或者 yarn
官方强烈推荐包管理器版本
> npm@5.x | yarn@1.x | pnpm@2.x
-
web 应用支持浏览器
Chrome, Firefox, Edge 和 IE11以上
命令行安装
npm
全局安装
npm install -g verdaccio复制代码
或者使用 yarn
yarn global add verdaccio复制代码
使用
安装好后需要命令行执行
$> verdaccio warn --- config file - /home/.config/verdaccio/config.yamlwarn --- http address - http://localhost:4873/ - verdaccio/3.0.0复制代码
然后打开浏览器 访问地址 正常显示即成功, 4873是默认端口。 另外建议安装 nrm
方便管理 npm 源。
npm i -g nrm复制代码
安装好后
nrm add verdaccio http://localhost:4873/ # 添加源nrm use verdaccio # 更换源复制代码
然后就是添加用户,登录就可以发布、安装了。
配置
在当前用户的 .config/verdaccio
下默认有两个文件:config.yaml
和 htpasswd
。这里介绍两个比较重要的配置项,其他的可以官网上查询。
权限配置
一般团队或者公司的私有项目,会采用不同的权限控制。
操作权限:
access
表示哪一类用户可以对匹配的项目进行安装(install)publish
表示哪一类用户可以对匹配的项目进行发布(publish)proxy
如其名,这里的值是对应于 uplinks 的
组权限:
$all
表示所有人都可以执行对应的操作$authenticated
表示只有通过验证的人可以执行对应操作$anonymous
表示只有匿名者可以进行对应操作(通常无用)
了解这几项配置后就能很简单地使用 verdaccio 的权限控制了
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复制代码
账号配置
因为是私有源,我们可以设置 config.yaml
中的 max_users: -1
来禁用 npm adduser 命令来创建用户。如果需要添加用户这里介绍两种方法:
-
可以通过安装 来添加账号
$ npm install htpasswd-for-sinopia -g$ sinopia-adduser # 在 htpasswd 目录下执行复制代码
然后就是根据提示填写账号密码就行。
-
verdaccio 的认证是基于 , 可以通过官方提供的工具来生成 ,将生成的段字符串添加到
htpasswd
中即可。
部署
可以使用forever、pm2或其他的守护进程进行管理。
$ npm i -g pm2 # 安装$ pm2 start `which sinopia` #启动复制代码
nginx 配置:
server { listen 80 default_server; location / { proxy_pass http://127.0.0.1:4873/; proxy_set_header Host $host; }}复制代码
写在最后
- 尽量不要再使用 sinopia 了会有各种坑,具体可以自己实验。
- 有问题可以在 stackoverflow 上提问,官方维护者非常友好,回复效率特别快。