需求(这段话是摘抄参考文档的,因为作者也想这么说):
公司出于自身隐私保护需要,不想把自己的代码开源到包管理区,但是又急需一套完整包管工具,来管理越来越多的组件、模块和项目。对于前端,最熟悉的莫过于npm,bower等;但是bower的市场兼容性明显没有npm强壮,加之commonjs规范的日益成熟。npm应该是前端包管理的不二选择。
公司对于搭建本地私有npm库有如下要求:
私有包托管在内部服务器中
项目中使用了公共仓库上的公共包,也使用了内部服务器上的私有包
希望下载的时候,公共包走公共仓库,私有包走内部服务器的私有仓库
服务器硬盘有限,希望只缓存下载过的包,而不是全部同步。
对于下载,发布npm包有对应的权限管理,安装方便,配置简单,依赖少。
Sinopia 是一个零配置的私有的带缓存功能的npm包管理工具。
1.要安装的软件
软件简介
nodejs/npm 软件名称: node-v6.9.1-linux-x64.tar.gz 下载地址:https://npm.taobao.org/mirrors/node/v6.9.1/
安装命令:
tar -xvf node-v6.9.1-linux-x64.tar.gz
sinopia 版本:1.4.0
安装命令:
npm install -g sinopia
pm2 版本:2.1.4 安装命令:
npm install -g pm2
nrm 版本:1.0.0 安装命令:
npm install -g nrm
规划目录(下为本次安装的实际目录,可根据实际环境调整)
项 | 目录 | 账户 | 备注 |
npm、nodejs解压目录 | /opt/software | nadmin | |
sinopia启动时目录 | /home/nadmin | nadmin | |
sinopia的passwd路径 | /home/nadmin/node_htpasswd | nadmin | |
sinopia的storage路径 | /home/nadmin/sinopia/storage | nadmin | 建议磁盘空间较大不推荐放在home目录 |
2.具体安装步骤(Server端)
创建账户nadmin
$ useradd nadmin
安装node和npm
安装步骤1的目录和命令,解压软件 node-v6.9.1-linux-x64.tar.gz
(注:npm会在安装node的时候一起安装)
$ tar -xvf node-v6.9.1-linux-x64.tar.gz
添加node_home到环境变量,用root账户修改/etc/profile
$vim /etc/profile #追加NODE_HOME=/opt/software/node-v6.9.1-linux-x64PATH=$PATH:$NODE_HOME/bin
source 使配置生效
$ source /etc/profile
配置生效之后,在任意地方可查看版本如下:
1 $ node -v2 v6.9.13 $ npm -v4 3.10.8
配置npm
先查看npm的配置文件地址
$npm config get userconfig/home/nadmin/.npmrc
修改此配置文件,修改后查看,内容如下
$ cat /home/nadmin/.npmrcproxy=http://网络代理ip:8080/https-proxy=http://网络代理ip:8080/no_proxy=本地yum源ipregistry=https://registry.npm.taobao.org/
也可通过命令设置http网络代理地址和npm server的地址,如下:
$ npm config set proxy http://server:port
$ npm config set https-proxy http://server:port
$ npm config set registry "http://registry.npmjs.org/"
~~由于上步骤npm已经安装配置完毕,所以下面的安装软件可以通过npm命令进行~~
安装sinopia
$npm install -g sinopia
配置sinopia
Sinopia的特点是,你在哪个目录运行,它的就会在对应的目录下创建自己的文件。目录下默认有两个文件:config.yaml和storage,htpasswd 是添加用户之后自动创建的
由于每次启动默认的config.
地址:sinopia安装目录/conf/ default.yaml
查看
$ pwd/opt/software/node-v6.9.1-linux-x64/lib/node_modules/sinopia/conf$ lltotal 12-rw-rw-r-- 1 nadmin nadmin 1309 Nov 9 19:52 default.yaml-rw-rw-r-- 1 nadmin nadmin 4076 Jun 7 2015 full.yaml-rw-rw-r-- 1 nadmin nadmin 39 Jun 7 2015 README.md
修改完毕,内如下:
storage: ./storageauth:htpasswd: file: /home/nadmin/node_htpasswduplinks:npmjs: url: http://registry.npm.taobao.org/packages:'@*/*': access: $all publish: $authenticated'*': access: $all publish: $authenticated proxy: npmjslogs:- {type: stdout, format: pretty, level: http}listen: 0.0.0.0:4873http_proxy: http://代理服务器ip:8080https_proxy: http://代理服务器ip:8080
启动 sinopia
在规划好的启动目录下执行命令sinopia
$ pwd/home/nadmin$ sinopiawarn --- config file - /home/nadmin/sinopia/config.yamlwarn --- http address - http://0.0.0.0:4873/http --> 200, req: 'GET http://registry.npm.taobao.org/express', bytes: 0/578356http <-- 200, user: admin, req: 'GET /express', bytes: 0/34448http --> 200, req: 'GET http://registry.npm.taobao.org/type-is', bytes: 0/54083
sinopia已经启动,可正常使用,此种方法日志会输出到控制台,不建议使用,后面会介绍使用pm2对sinopia进程进行托管启动的方法。
访问http://ServerS::4873 查看页面,看到如下页面,说明sinopia安装成功!
$ nrm use XXXX # 使用本址的镜像地址
3.验证
在客户端ServerC假设使用者已经安装npm/nrm并且已经正确配置
1>npm install
现在验证使用刚刚搭建好的sinopia npm库(http://serverS:4873/)进行安装软件和发布软件
修改npm的访问代理为刚刚搭建好的http://serverS:4873/
# cat .npmrcregistry=http://serverS:4873/
执行安装express的命令
$npm install express
安装成功!
2>npm publish
本地如果有可用来发布的模块可以直接用,本地没有,使用npm init根据提示创建一个。
初始化创建一个模块
$npm init
如果需要登录才能publish则登录
运行npm adduser注册账号,如果已经有账号直接运行 npm login
登录成功时可通过npm whoami查看
执行发布
# npm publish chenyu/+ chenyu@1.0.0
去serverS查看刚刚publish的模块:成功!
npm常见使用命令
1>常用命令
npm install XX :本地安装,安装到当前的目录中
npm install –g XX :模块将被安装到【全局目录】
查看全局目录npm config get prefix
设置全局目录npm config set prefix XXX
查看缓存目录npm config get cache
设置缓存目录npm cofnig set cache XXX
一般采用全局安装,方便管理、结构清晰还可以重复利用
其他命令如下:
npm install <name>安装nodejs的依赖包
例如npm install express 就会默认安装express的最新版本,也可以通过在后面加版本号的方式安装指定版本,如npm install express@3.0.6
npm install <name> -g 将包安装到全局环境中
但是代码中,直接通过require()的方式是没有办法调用全局安装的包的。全局的安装是供命令行使用的,就好像全局安装了vmarket后,就可以在命令行中直接运行vm命令
npm install <name> --save 安装的同时,将信息写入package.json中
项目路径中如果有package.json文件时,直接使用npm install方法就可以根据dependencies配置安装所有的依赖包
这样代码提交到github时,就不用提交node_modules这个文件夹了。
npm init 会引导你创建一个package.json文件,包括名称、版本、作者这些信息等
npm remove <name>移除
npm update <name>更新
npm ls 列出当前路径下安装的了所有包
npm root 查看当前包的安装路径
npm root -g 查看全局的包的安装路径
npm help 帮助,如果要单独查看install命令的帮助,可以使用的npm help install
npm config get cache 查看npm的缓存目录
下过的包都在里面,比如刚刚下载的loadash
2>关于npm缓存目录的一些记录
npm安装的模块有两个缓存目录:
默认*inux和mac下是在用户主目录下的.npm目录下,通过npm config get cache 可以查看。window下则在%AppData%/npm-cache 目录下。
该目录下的模块结构为.npm/module_name/module_version/这种方式命名。
值得注意的是,执行npm install命令的时候npm只会检查node_modules中是否存在该模块,如果没有则会去registry下载,无论.npm文件夹下是否存在。这也是install速度慢的一个原因。
解决办法使用npm install --cache-min <整数时间> <package-name>;
这个命令的意思是从缓存中进行安装,只有再超过参数时间的时候才从regitry上安装。但内在也进行了一次与registry的交互,只是交互的etag属性,服务器返回304表示没有更新不需要下载
另外也可以将缓存目录设置成node_modules目录。
pm2命令详解
pm2是开源的基于Nodejs的进程管理器。包括进程、日志、监控的一整套完整功能。它带有负载均衡功能,当你要把你的独立代码资源利用全部的服务器所有cpu,保证进程永远都是活着的,0秒的重载,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] # 重置重启数量
$ pm2 startup # 创建开机自启动命令
$ pm2 save # 保存当前应用列表
$ pm2 resurrect # 重新加载保存的应用列表
$ pm2 update # Save processes, kill PM2 and restore processes
$ pm2 generate # Generate a sample json configuration file
$ pm2 deploy app.json prod setup # Setup "prod" remote server
$ pm2 deploy app.json prod # Update "prod" remote server
$ pm2 deploy app.json prod revert 2 # Revert "prod" remote server by 2
$ pm2 module:generate [name] # Generate sample module with name [name]
$ pm2 install pm2-logrotate # Install module (here a log rotation system)
$ pm2 uninstall pm2-logrotate # Uninstall module
$ pm2 publish # Increment version, git push and npm publish
命令验证:
停止sinopia:
$ pm2 stop sinopia
启动sinopia:
$ pm2 start sinopia
重启 sinopia:
$ pm2 retart sinopia
显示 sinopia 的log:
$ pm2 logs sinopia
6.参考文档
https://segmentfault.com/a/1190000005790827
http://www.tuicool.com/articles/B3iyyya
原标题:用sinopia搭建npm私服
关键词: