组件化之后,搭建 “私有 npm 仓库” 是个不错选择。
私有 npm 仓库可以让我们使用组件就像 npm 官方仓库里的包一样方便。
一般私有 npm 仓库有以下一些特性:
- 私有包托管在内部服务器或者单独的服务器上;
- 可以同步整个官方仓库,也可以只同步需要的;
- 下载的时候,可以让公共包走公共仓库,私有包走私有仓库;
- 可以缓存下载过的包;
- 对于下载,发布,有对应的权限管理。
目前比较好的解决方案有两种:
sinopia 在 15 年的时候就停止更新了,继而由 verdaccio 提供更新升级,所以两者用法基本上都是一致的,以下都以 sinopia 为例说明。
$ npm install -g sinopia
配置文件位于 ~/.config/sinopia/config.yaml
中
# path to a directory with all packages
storage: /home/{user}/.local/share/sinopia/storage # 库存路径,需要考虑磁盘空间
web: # 自定义web项,即浏览器访问页面
title: Sinopia
auth:
htpasswd:
file: ./htpasswd # 添加用户(npm adduser)后自动创建,保存用户信息,可以初始化用户
uplinks: # 可以配置多个上游地址,后面packages中的proxy指定用哪个
npmjs:
url: https://registry.npm.taobao.org/ # 更改此上游地址
packages: # 包的权限管理,$all为所有人,$authenticated为通过验证人
# 分布和安装两种权限,值可以特指某几人
'@*/*': # 跟package.json中的name属性进行匹配
# scoped packages
access: $all
publish: $authenticated
'*':
access: $all
publish: $authenticated
proxy: npmjs
logs:
- {type: stdout, format: pretty, level: http}
listen: 0.0.0.0:4873 # 设置监听地址,0.0.0.0匹配本机地址
更多配置参考 sinopia
$ npm config set registry http://{服务器ip}:4873/
推荐使用 nrm 来快速切换 npm registry 配置。
sinopia
或者使用 pm2 永久运行
pm2 start sinopia
现在你就可以发布私有包了。
3. cnpm + cnpmjs.org
sinopia
的优点是配置简单,对环境依赖少(仅 node 就够了),并且支持 windows
系统下运行。
但它也有缺点,主要是以下几点:
- 权限管理比较弱,对用户权限,发布权限,下载权限控制不是很得心应手;
- 缓存优化不足,经常会在安装共有包的时候处于挂起状态;
- 不能做官方仓库的镜像。
所以,sinopia
比较适合个人搭建在本地作为 npm 缓存,这样,安装过的包会直接从缓存中获取,加快安装速度。
对于企业级的应用来说,就需要另外一个解决方案了:cnpm + cnpmjs.org
环境依赖:
$ npm install -g cnpm
$ npm install -g cnpmjs.org
配置文件位于 ~/.cnpmjs.org/config.json
中
{
"debug": false, // 是否启动 debug 模式
"enableCluster": true, // 是否启用 cluster 模式
"mysqlServers": [ // 数据库配置,以 mysql 为例
{
"host": "host",
"port": 3306,
"user": "user",
"password": "password"
}
],
"mysqlDatabase": "cnpmjs", // 数据库名
"enablePrivate": true, // 是否启用私有化,这样只有定义在 `admins` 中的用户才能发布
"admins": { // 管理员配置,可以配置多个
"deepraining": "[email protected]"
},
"syncModel": "exist", // 同步模式
"scopes": [ // 包前缀,如果不是以这个前缀命名的包将不能发布,可以配置多个
"@test"
],
"registryHost": "http://your.company.npm.registry.com", // 你的服务器对应的 npm registry 地址
"sourceNpmRegistry": "https://registry.npm.taobao.org" // 如果在该仓库中找不到的包,会上游到哪里去找
}
更多配置参考 cnpmjs.org config
$ cnpm config set registry http://your.company.npm.registry.com
cnpmjs.org start
运行的时候将会开启两个端口:7001(registry),7002(web)。
用来在命令行发布,下载包等对用的远程 registry 地址。比如一些比较常用的 registry 地址:
npm
: https://registry.npmjs.org/ npm 官方仓库地址cnpm
: http://r.cnpmjs.org/ cnpmjs.org 官方仓库地址taobao
: https://registry.npm.taobao.org/ 淘宝 NPM 镜像
用 nginx 配置 url 地址到 7001 端口:
server {
listen 80;
listen [::]:80;
server_name your.company.npm.registry.com;
location / {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $http_host;
proxy_pass http://127.0.0.1:7001;
}
location ~ /.well-known {
allow all;
}
client_max_body_size 50m;
}
重启 nginx,现在你就可以通过 http://your.company.npm.registry.com
去发布私有包到这个仓库里了(如果没有其他问题的话)。
用来在 web 端查看仓库信息,搜索包,包信息等。比如一些比较常用的地址:
用 nginx 配置 url 地址到 7002 端口:
server {
listen 80;
listen [::]:80;
server_name your.company.npm.com;
location / {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $http_host;
proxy_pass http://127.0.0.1:7002;
}
location ~ /.well-known {
allow all;
}
client_max_body_size 50m;
}
重启 nginx,现在你就可以通过 http://your.company.npm.com
访问仓库 web 页面了(如果没有其他问题的话)。
如果仅通过 cnpmjs.org start
运行,一旦关闭终端,程序就会停止运行。推荐使用 screen
命令开启永久运行,可以通过 Linux screen 了解下这个命令的用法。
# 创建一个名为 cnpmjs 的窗口
$ screen -S cnpmjs
# 运行程序
$ cnpmjs.org start
# 按Ctrl+a,然后再按d,离开当前窗口,而程序不会终止
Ctrl+a+d
# 重新进入 cnpmjs 的窗口,做更多的操作
$ screen -r cnpmjs
参考文章:
更多博客,查看 https://github.com/deepraining/blogs
版权声明:自由转载-非商用-非衍生-保持署名(创意共享 3.0 许可证)