起因
最近在做一个业务组件库的项目,公司内部又没有私有的npm仓库,所以就将组件库放到gitlab上做版本控制。
但是放在gitlab的话,管理起来十分麻烦:
- 版本发布时候,需要构建代码并推到仓库中,然后再打tag
- 项目中安装的版本时候,需要按gitlab仓库地址安装,并且在每次更新时需要手动改tag号
所以,我们迫切需要一个私有的npm仓库。
调研
经过一番搜寻,发现目前大概有三种方式来做私有的npm库
我在本地先后体验了 cnpm
和 verdaccio
两个工具的发布和部署。
最终选择使用 verdaccio
的原因:
- 轻量化,基本不需要怎么配置,维护负担小
- 小团队暂时没有做包缓存的需要(也没有富余的机器资源)
- 官方提供了现成的
docker
镜像,几乎可以一键上线 - dan大佬的好评
docker pull verdaccio/verdaccio
部署
- 配置
docker-compose.yml
version: '3.1'
services:
xx_npm_registry: # 修改这里
image: verdaccio/verdaccio
container_name: "xx_npm_registry" # 修改这里
ports:
- "4873:4873"
networks:
- node-network
# 自定义配置
volumes:
- "./storage:/verdaccio/storage"
- "./config:/verdaccio/conf"
- "./plugins:/verdaccio/plugins"
networks:
node-network:
driver: bridge
- 创建配置文件
./config/config.yaml
storage: /verdaccio/storage # 文件存储,默认使用内置本地文件模式存储
# 账号与认证
auth:
htpasswd:
# 默认使用htpasswd,创建的用户会添加到本地文件htpasswd中
file: /verdaccio/conf/htpasswd
# 上游registry地址配置
uplinks:
npmjs:
# 该仓库没有的包会去上游registry去获取
# 这里配置为淘宝的npm registry
url: https://registry.npm.taobao.org/
# 包下载、发布限制
packages:
"@jiedianfe/*":
access: $all
publish: $authenticated
"**":
access: $all
publish: $all
proxy: npmjs
# 日志
logs:
- {type: stdout, format: pretty, level: http}
# 私有仓库前端页面配置
web:
enable: true # 启用前端页面
title: xxNPM # 修改这里
# logo: logo.png
# scope:
- 配置
nginx
转发
server {
listen 80;
listen 443 ssl http2;
server_name npm.xxxx.com; # 修改这里
include /etc/nginx/sites-enabled/ssl_certificate;
location / {
# xx_npm_registry与docker-compose.yaml中的服务名对应
proxy_pass http://xx_npm_registry:4873;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-NginX-Proxy true;
proxy_ssl_session_reuse off;
proxy_set_header Host $http_host;
proxy_redirect off;
}
}
- 检查相应目录权限
我在本地体验时,卡在了文件权限这一步。
具体表现是,网站可以正常启动,但是 npm adduser
和 npm publish
都不会成功,原因就是没有相应的权限。
最终结合文档中提到的权限问题和网上其他同学的解决方法搞定了
chown -R 10001:65533 /path/for/verdaccio
- 启动
docker-compose up --build -d
在项目中使用
在.npmrc
中配置,对应的scope走私有库即可
@xxscrop:registry=http://your-npm-registry.com/
@xxteam::registry=http://your-npm-registry.com/
小结
我个人感觉 verdaccio
适合小团队或个人做私有库的相关尝试,因为不用怎么折腾就可以快速达到目的。
另一点优势就是dan提到的本地一些场景的快速验证。
缺点的话就是配置确实很少,如果对于npm私有库的需求比较复杂,比如权限控制、包缓存等就不太适合了。
场景比较复杂的话,可能使用 cnpm
更加合适。cnpm
虽然部署上略微麻烦一些,但是在持久存储有更多的选择,比如可以使用 mysql
、sqlite
。权限控制上可以配置的东西也丰富一些。