随着Nodejs开发的项目越来越多,Node项目管理就成了一个需要思考的问题了。如果所有项目都开源统一用 NPM 进行管理也没什么问题,但总有一些是我们不希望的完全开放的代码,作为企业是核心秘密保留在公司内部,这个时候就需要在公司内网也搭建一套 NPM 依赖管理系统。CNPM正好就提供了这个功能。从Github上CNPM的主页看,CNPM由国内Alibaba团队开发维护。
CNPM 是一个Nodejs的库,致力于打造私有的 NPM 注册服务。当然,除了私有库功能以外,CNPM官网 (http://cnpmjs.org/)还提供了NPM同步的服务。CNPM官方发布的架构图:
从CNPM的架构图中,我们可以看出CNPM是对NPM做的镜像服务,CNPM会定期同步NPM的资源库,同时CNPM支持发布私有的库,这样就非常方便地集成了公有库和私有库,对于公司内部的开发者来说,基本感觉不到两种库的区别。
另外,我们使用NPM下载依赖包时,经常性地会遇到一些包下载失败的情况,主要原因了NPM的注册服务器在国外,国内的网络环境访问国外的IP并不是太好。所以,直接配置到国内的NPM镜像,可以减少NPM下载出错机会。
比如,最近发生的NPM下载时的“No compatibleversion found”错误,如果不想升级NPM的环境,那么你还选择用CNPM去进行依赖管理
从官方文档中,我们看到CNPM服务器环境,只需要Node(0.11.12)+ MySQL(>= 0.5.0),另外我们还需要Linux的环境,接下来就让我们动手自己搭建一个私有NPM的服务器。
我的系统环境:
通过github下载CNPM项目源代码
git clone git://github.com/cnpm/cnpmjs.org
进入项目目录
cd cnpmjs.org
安装依赖包之前,先要升级NPM的版本
命令如下:
npm install -g npm
执行命令安装依赖包
npm install
缺少依赖包的报错如下图:
命令如下:
mysql -uyixiang -p cnpmjs < docs/db.sql
执行命令之前,你应该确保你的mysql数据库已安装,且已创建名为 cnpmjs的数据库
进入cnpmjs.org目录中的config目录并创建文件 config.js 如下图:
编辑 config.js 添加配置
module.exports = {
debug: false,
bindingHost: '192.168.8.200', // 设定只能用该IP访问cnpm服务器
scopes: ['@yixiang'],//指定你的私有包的前缀,你发布的包必须以此开头
enableCluster: true, // enable cluster mode
sourceNpmRegistry: 'https://registry.npm.taobao.org',
database: {
db:'cnpmjs', // 数据库名
host: '192.168.8.200', // 你的数据库地址
port:3306, // 默认
username:'yixiang', // 默认
password:'123456', // 默认为空
dialect:'mysql' // 使用mysql,默认为sqlite,
},
enablePrivate:true, // 开启私有库
admins: {
admin: '[email protected]',
},
syncModel: 'none'//默认有none ,exist,all,此处设置为none,即不同步npm源已有的库至本地,如果设置为exist,则会同步线上npm源存在的模块,比如,当你执行安装某线上模块时,则会把线上该模块版本全部同步至本地库
}
该配置会覆盖index.js的配置
Vim /etc/sysconfig/iptables
如下图:
启动cnpm服务器
命令如下:
node --harmony dispatch.js
执行后如下图
添加cnpm管理员用户用于发布私有包,因为cnpm必须是admin用户才能进行publish
命令如下:
在cnpm服务器192.168.8.200中添加名为admin密码为admin邮箱为[email protected]
npm adduser --registry=http://192.168.8.200:7001
Username: admin
Password: admin
Email: (this IS public) 必须为上面配置的邮箱,即[email protected]
如下图:
本地包的配置package.json
{
"name": "@yixiang/one",
"version": "1.0.0",
"main": "./testone.js",
"description": "A Common Module",
"author": "ezen"
}
testone.js 文件内容
/*
* 公共模块
*/
function hello(name) {
console.log("Hello " + name);
}
exports.hello = hello;
首先登录到cnpm服务器端,如下命令
npm login --registry=http://192.168.8.200:7001
如下图:
打开本地的包文件所在目录,执行如下命令:
npm publish --registry=http://192.168.8.200:7001
npm unpublish --registry=http://192.168.8.200:7001 包名@版本
如下图,取消名为 @yixiang/testone 的包的发布
命令
npm install --registry=http://192.168.8.200:7001包名@版本
例子:
npm install --registry=http://192.168.8.200:7001@yixiang/[email protected]