从0搭建npm私有仓库 采坑实记
我的现有环境
Liunx 环境采用了 centos 7.4 64位 (阿里云)
一台Mac 用于发布npm包 (装有nodejs和npm环境,本篇就不赘述了)
搭建流程
- 搭建centos 的 node 和 npm 环境 (服务端)
- 安装PM2 (个人觉得不错的node进程管理器) (服务端安装)
- 安装 nrm (npm仓库源管理工具) (服务端安装,推荐客户端也安装)
- 安装 sinopia (npm私有仓库管理工具 ) (服务端安装)
- 配置相关项
- 上传到私有仓库 (此处有个坑)
搭建centos 的 node 和 npm 环境
从nodejs官网上下载安装包 ,这里我下载 8.11.3 的版本,没试过node10以上,没敢试~
image-20180801102322116.png下载好了之后,使用ftp工具上传到服务器上,我放到了/opt 目录下
解压
$ xz -d node-v8.11.3-linux-x64.tar.xz
$ tar -xvf node-v8.11.3-linux-x64.tar
移动文件夹到/usr/local 目录下
$ mv node-v8.11.3-linux-x64 /usr/local/node
配置环境变量
$ echo 'export PATH=/usr/local/node/bin:$PATH' >> /etc/profile
$ source /etc/profiles //让配置文件生效
$ln -s /usr/local/node/bin/npm /usr/local/bin/npm
$ln -s /usr/local/node/bin/node /usr/local/bin/node
验证一下
$ node -v
v8.11.3
$ npm -v
5.6.0
至此,node和npm环境搭建完成。
安装pm2
PM2是node进程管理工具,可以利用它来简化很多node应用管理的繁琐任务,如性能监控、自动重启、负载均衡等,而且使用非常简单。
安装非常简单,使用我们刚才安装的npm就可以
$ npm install -g pm2
这里简单介绍一下pm2的常用命令
$ pm2 start app.js # 启动app.js应用程序
$ pm2 start app.js -i 4 # cluster mode 模式启动4个app.js的应用实例 # 4个应用程序会自动进行负载均衡
$ pm2 start app.js --name="api" # 启动应用程序并命名为 "api"
$ pm2 start app.js --watch # 当文件变化时自动重启应用
$ pm2 start script.sh # 启动 bash 脚本
$ pm2 list # 列表 PM2 启动的所有的应用程序
$ pm2 monit # 显示每个应用程序的CPU和内存占用情况
$ pm2 show [app-name] # 显示应用程序的所有信息
$ pm2 logs # 显示所有应用程序的日志
$ pm2 logs [app-name] # 显示指定应用程序的日志
$ pm2 flush
$ pm2 stop all # 停止所有的应用程序
$ pm2 stop 0 # 停止 id为 0的指定应用程序
$ pm2 restart all # 重启所有应用
$ pm2 reload all # 重启 cluster mode下的所有应用
$ pm2 gracefulReload all # Graceful reload all apps in cluster mode
$ pm2 delete all # 关闭并删除所有应用
$ pm2 delete 0 # 删除指定应用 id 0
$ pm2 scale api 10 # 把名字叫api的应用扩展到10个实例
$ pm2 reset [app-name] # 重置重启数量
安装nrm
使用npm进行安装
$ npm install -g nrm
安装完成之后我们可以使用 nrm 来切换npm源
$ nrm ls //查询现有源
npm ---- https://registry.npmjs.org/
cnpm --- http://r.cnpmjs.org/
taobao - https://registry.npm.taobao.org/
nj ----- https://registry.nodejitsu.com/
rednpm - http://registry.mirror.cqupt.edu.cn/
npmMirror https://skimdb.npmjs.com/registry/
edunpm - http://registry.enpmjs.org/
先切换成淘宝的源,下载速度可能会快一些。
$ nrm use taobao
一会我们安装完自己的npm私有仓库就可以用它来切换
安装 sinopia
$ npm install -g sinopia
安装完成后 我们先使用 sinopia 来启动
$ sinopia
Sinopia doesn't need superuser privileges. Don't run it under root.
warn --- config file - /root/.config/sinopia/config.yaml
warn --- http address - http://localhost:4873/
warn --- config file - /root/.config/sinopia/config.yaml ## 配置文件的地址(下文会说到)
warn --- http address - http://localhost:4873 ## 启动的地址 我们可以访问该地址来看到npm仓库中的项目
通常不采用这样的启动方式。我们使用pm2来启动
$ pm2 start sinopia
image-20180801135158019.png
sinopia 默认的端口号是 4873 ,打开4873端口
我这里使用的是 firewal ,有用iptables的小伙伴请自行查询开启方法
$ firewall-cmd --add-port=4873/tcp --permanent #打开4873端口
success
$ firewall-cmd --reload #重启防火墙
success
好了,这样就打开。
因为使用的阿里云服务器 还要配置一下阿里云的安全组规则,不然的话还是访问不到
找到安全组管理,新增一条规则,允许访问 4873 端口
image-20180801135856013.png配置相关项
仓库搭好了,在来看一下配置文件
$ cat /root/.config/sinopia/config.yaml
#
# This is the default config file. It allows all users to do anything,
# so don't use it on production systems.
#
# Look here for more config file examples:
# https://github.com/rlidwka/sinopia/tree/master/conf
#
# path to a directory with all packages
storage: ./storage # 库存路径,需要考虑磁盘空间
auth:
htpasswd:
file: ./htpasswd # 添加用户(npm adduser)后自动创建,保存用户信息,可以初始化用户
# Maximum amount of users allowed to register, defaults to "+inf".
# You can set this to -1 to disable registration.
# max_users: -1 # 设置为-1不能npm adduser
# a list of other known repositories we can talk to
uplinks: # 可以配置多个上游地址,后面packages中的proxy指定用哪个
npmjs:
url: https://registry.npmjs.org/
packages: # 包的权限管理,$all为所有人,$authenticated为通过验证人
# 分布和安装两种权限,值可以特指某几人
'@*/*': # 跟package.json中的name属性进行匹配
# scoped packages
access: $all
publish: $authenticated
'*':
# allow all users (including non-authenticated users) to read and
# publish all packages
#
# you can specify usernames/groupnames (depending on your auth plugin)
# and three keywords: "$all", "$anonymous", "$authenticated"
access: $all
# allow all known users to publish packages
# (anyone can register by default, remember?)
publish: $authenticated
# if package is not available locally, proxy requests to 'npmjs' registry
proxy: npmjs
# log settings
logs:
- {type: stdout, format: pretty, level: http}
#- {type: file, path: sinopia.log, level: info}
listen: 0.0.0.0:4873 # 设置监听地址,0.0.0.0匹配本机地址
添加了
listen: 0.0.0.0:4873
重启 sinopia
pm2 reload all
(这里我直接reload all 因为我的pm2中只有这一个服务,当有多个服务的时候,请使用 $ pm2 reload 进程id )
使用浏览器访问
image-20180801140329030.png到此,npm私有仓库搭建完成
上传到私有仓库
搭建好了之后开始上传一个项目吧~
在客户端新建个文件夹起名叫tools
打开终端(命令行)进入到该目录,初始化一个npm工程
$ npm init
Press ^C at any time to quit.
package name: (tools)
version: (1.0.0)
description:
entry point: (index.js)
test command:
git repository:
keywords:
author:
license: (ISC)
About to write to /Users/zhanglei/Desktop/tools/package.json:
{
"name": "tools",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "zhang",
"license": "ISC"
}
Is this ok? (yes)
此时生成了一个package.json文件
# package.json
{
"name": "tools",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "zhang",
"license": "ISC"
}
新建index.js文件
#index.js
var Toole = function () {
}
Toole.prototype.hello = function(){
return "hello";
}
module.exports = new Toole();
设置客户端的npm源为刚才搭建的私有仓库,我这里使用了nrm
$ nrm add mynpm http://{ip}:{port}/
$ nrm ls
npm ---- https://registry.npmjs.org/
cnpm --- http://r.cnpmjs.org/
taobao - https://registry.npm.taobao.org/
nj ----- https://registry.nodejitsu.com/
rednpm - http://registry.mirror.cqupt.edu.cn/
npmMirror https://skimdb.npmjs.com/registry/
edunpm - http://registry.enpmjs.org/
mynpm - http://xxxx:xxx/
$ nrm use mynpm
创建npm账户,在发布包之前,一般需要创建用户,否则报错
创建一个admin账户
$ npm adduser
image-20180801143354589.png
一般来说这样就创建完成。此时在服务器的
/root/.config/sinopia/
目录下应生成一个 htpasswd 文件来保存用户信息,用以登录
可是我在创建过程中发现注册完npm用户后并未创建该文件,无法上传npm包
查询资料后发现可以使用 htpasswd-for-sinopia 来注册用户
回到服务端
全局安装 htpasswd-for-sinopia
$ npm install -g htpasswd-for-sinopia
在 /root/.config/sinopia/ 下添加 新建 htpasswd文件
$ cd /root/.config/sinopia/
$ touch htpasswd
设置服务端的npm源为本地私有仓库
$ nrm add mynpm http://{ip}:{port}/
$ nrm ls
npm ---- https://registry.npmjs.org/
cnpm --- http://r.cnpmjs.org/
taobao - https://registry.npm.taobao.org/
nj ----- https://registry.nodejitsu.com/
rednpm - http://registry.mirror.cqupt.edu.cn/
npmMirror https://skimdb.npmjs.com/registry/
edunpm - http://registry.enpmjs.org/
mynpm - http://xxxx:xxx/
$ nrm use mynpm
添加用户
$ sinopia-adduser #注意此部要在有 htpasswd 文件的路径执行
username:admin
password:123456
$ /root/.config/sinopia/htpasswd
admin:{SHA}fEqNCco3Yq9h5ZUglD3CZJT4lBs=:autocreated 2018-07-31T08:35:01.596Z
此时用户添加完成。
回到客户端
继续上传项目
使用刚才注册账号进行登录
$ npm login
Username: (admin) admin
Password: (<default hidden>)
Email: (this IS public) (xxxx@xx.com)
Logged in as admin on http://xxxx:4873/.
上传
$ npm publish
+ tools@1.0.0
使用浏览器访问 , 登录后可以看到刚才上传项目
image-20180801145718428.png在服务端也可以看到 我们刚发布的项目
$ ls /root/.config/sinopia/storage/tools/
package.json tools-1.0.0.tgz
项目更新
当我们想更新项目时候还可以使用
$ npm publish
npm ERR! code EPUBLISHCONFLICT
npm ERR! publish fail Cannot publish over existing version.
npm ERR! publish fail Update the 'version' field in package.json and try again.
npm ERR! publish fail
npm ERR! publish fail To automatically increment version numbers, see:
npm ERR! publish fail npm help version
如果我们未修改 package.json 中的 verison 字段时 npm 会报错
难么我们怎么修改比较科学呢?
使用命令:npm version <update_type>进行修改 update_type 有三个参数,
第一个是patch,第二个是minor,第三个是 major,
patch:这个是补丁的意思,补丁最合适;
minor:这个是小修小改;
major:这个是大改咯;
具体咋用:
比如我想来个1.0.1版本,注意,是最后一位修改了增1,那么命令:npm version patch 回车就可以了;
比如我想来个1.1.0版本,注意,是第二位修改了增1,那么命令:npm version minor 回车就可以了;
比如我想来个2.0.0版本,注意,是第一位修改了增1,那么命令:npm version major 回车就可以了;
继续操作
$ npm version patch
v1.0.1
$ npm publish
+ tools@1.0.1
完成后我们在回来看一下,版本变成了v1.0.1
image-20180801150643681.png服务端的仓库里面也会存有两个版本的,供选择下载
$ ls /root/.config/sinopia/storage/tools/
package.json tools-1.0.0.tgz tools-1.0.1.tgz
取消发布的项目
注意需要加上 --force (取消有风险,需谨慎)
$ npm republic tools --force
npm WARN using --force I sure hope you know what you are doing.
- tools
至此,npm私有仓库搭建和使用基本完成。
网友评论