cnpm是一个开源的企业内部构建npm镜像和私有npm仓库的解决方案。与企业业务逻辑相关的模块可能不适合开源。这些私有模块可以在私有npm存储库中进行管理和维护。下面是搭建私有npm的详细步骤。这里使用阿里团队开源的[cnpmjs.org][href1],主要分为服务端配置和客户端配置:服务端主要包括cnpm、mysql、nginx配置。环境:#system$cat/etc/redhat-releaseCentOSLinuxrelease7.1.1503(Core)#node$node-vv6.9.1#npm$npm-v3.10.9#nginx$nginx-vnginxversion:nginx/1.9.9#mysql$mysql-uyourname-p$mysql>\s;服务器版本:5.5.38-logMySQLCommunityServer(GPL)#serverip192.168.33.10安装:#clonefromgithub$gitclonegit://github.com/cnpm/cnpmjs.org.git$HOME/cnpmjs.org$cd$HOME/cnpmjs.org#initmysql$mysql-u你的名字-pmysql>创建数据库cnpmjs;mysql>使用cnpmjs;mysql>sourcedocs/db.sqlconfiguration:$pwd/home/xxx/cnpmjs.org$vimconfig/config.jsmodule.exports={debug:false,//添加自己的私有前缀,可以有多个,requiredscope:['@test'],enableCluster:true,//mysql,所需数据库:{db:'cnpmjs',username:'username',password:'password',dialect:'mysql',host:'192.168.33.10',port:3306,池:{maxConnections:10,minConnections:0,maxIdleTime:30000},日志记录:!!process.env.SQL_DEBUG,},邮件:{enable:false,appname:'appname',from:'from',service:'service',auth:{user:'user',pass:'pass'}},//日志目录,cnpm运行日志,必填logdir:'/data/logs/cnpm/node_logs/',nfs:require('fs-cnpm')({//包存放目录,必填dir:'/data/logs/cnpm/node_nfs/',}),//上传目录,必填uploadDir:'/data/logs/cnpm/node_modules/',enablePrivate:true,//注册域名,必填registryHost:'registry.cnpm.xx.com',//可以发布包的用户,必须填写admins:{admin:'admin'},//同步官方包的方式,必须填写syncModel:'exist',//'none','all','exist'//packagesizejsonLimit:1073741824,//私有前缀的包白名单不受cnpm管理privatePackages:['@remobild/react-native-toast']};$vimconfig/index.js#把bindingHost注释掉,对外网开放,否则只能在本地提交bindingHost:''#注意不建议全部写在syncModel中。all模式下会同步整个官方仓库,需要大量存储存储空间#确保logdir,nfsdir,uploadDir目录权限是可写的#包的大小取决于你自己的包。如果有一个特别大的包,并且是nginx代理的,那么nginx的client_max_body_size除了jsonLimit之外,还要修改安装依赖:$npminstall--build-from-source--registry=https://registry.npm.taobao.org--disturl=https://npm.taobao.org/mirrors/nodestart:#调试模式$npmrundev#后台启动$npmstart#查看注册表$curlhttp://192.168.33.10:7001#查看web$curlhttp://192.168.33.10:7002#上面两个端口也可以通过config.js修改,默认7001和7002写在config/index.jsnginx:(这一步不用必要的,客户端后面可以直接使用ip)cnpm.xx.comupstreamcnpm{server127.0.0.1:7002;}server{listen80;server_namecnpm.xx.com;location/{proxy_set_headerX-Real-IP$remote_addr;proxy_set_headerX-Forwarded-For$proxy_add_x_forwarded_for;proxy_set_header主机$http_host;proxy_passhttp://cnpm/;proxy_redirect关闭;}}registry.cnpm.xx.comupstreamregistry_cnpm{server127.0.0.1:7001;}server{listen80;server_nameregistry.cnpm.xx.com;location/{proxy_set_headerX-Real-IP$remote_addr;proxy_set_headerX-Forwarded-For$proxy_add_x_forwarded_for;proxy_set_header主机$http_host;proxy_passhttp://registry_cnpm/;就这样,在本地绑定host访问cnpm.xx.comClient就可以看到自己的npm仓库了,Client主要是配置命令行工具完成注册、登录等步骤,然后就可以发布包了到你自己的npm仓库。安装cnpm:#cnpm官方有自己的cnpm命令,但是在我们实际使用中,出现了一些问题,于是我们采用了给npm官方命令添加别名的方法$echo-e'\n#aliasforcnpm\naliascnpm="npm--registry=http://registry.cnpm.xx.com--cache=$HOME/.npm/.cache/cnpm--disturl=http://xx.com--userconfig=$HOME/.cnpmrc"'>>~/.bashrc&&source~/.bashrc配置:1.配置cnpmrc$vim~/.cnpmrcregistry=http://registry.cnpm.xx.com2.注册(之前需要注册registering发送人的邮箱前缀给管理员,管理员只能在上面的config.js中添加)$cnpmadduser依次输入用户,密码,邮箱3.登录$cnpmlogin如果没有错误,登录成功使用:#publishpackage$mkdirtest&&cdtest$cnpminit-y$touchtest.js$cnpmpublish#installpackage$cnpminstall@test/test--save以上就是配置过程客户端,还是很简单的。通过以上服务端和客户端的配置,我们可以将一些我们公司不方便的包发布到自己的npm仓库中。另外,cnpm也可以从官方仓库安装包。安装过程中,cnpm会在自己的仓库中搜索要安装的包。如果找不到,会默认去https://npm.taobao.org找。这是阿里团队维护的一个完整的https://www.npmjs.com镜像。同步频率目前为每10分钟一次,以确保尽可能与官方服务同步。
