使用cnpm搭建企业内部私有NPM仓库

8

cnpm

cnpm是企业内部搭建npm镜像和私有npm仓库的开源方案。它同时解决了现有npm架构的一些问题

为什么企业需要私有NPM

主要有如下理由:

  • 确保npm服务快速、稳定:对于企业来说,上线生产系统的时候,需要花半小时甚至更久等待npm模块依赖安装完毕,是不可接受的。部署镜像后,可以确保高速、稳定的npm服务。
  • 发布私有模块:官方的npm上的模块全部是开源的。一些与企业业务逻辑相关的模块可能不适合开源。这部分私有的模块放在私有NPM仓库中,使用起来各种方便。
  • 控制npm模块质量和安全:npm上的模块质量参差不齐,搭建私有仓库,可以更严格地控制模块的质量和安全,只有经过审核的模块才允许被加入私有仓库。

cnpm的特点

  • 压缩包等文件从数据库中分离,放在CDN上,减轻了数据库的压力,提高了访问速度。
  • 使用MySQL替换了CouchDB,更容易部署。同时由于大部分开发者更熟悉MySQL,因此架设起来更方便。
  • CDN和MySQL都可以方便地扩展。

cnpm架构

5分钟部署

部署cnpm只需5分钟。

依赖

  • Node
  • MySQL
  • Redis
  • qiniu CND (或其他CDN)

部署过程

获取代码

git clone git://github.com/fengmk2/cnpmjs.org.git $HOME/cnpmjs.org
cd $HOME/cnpmjs.org

创建MySQL表

; mysql -u yourname -p
mysql> use cnpmjs;
mysql> source docs/db.sql

然后编写配置文件config/config.js

module.exports = {
    debug: false,
    enableCluster: true, // enable cluster mode
    mysqlServers: [
      {
        host: 'localhost',
        port: 3306,
        user: 'cnpmjs',
        password: 'cnpmjs123',
      }
    ],
    mysqlDatabase: 'cnpmjstest',
    redis: {
      host: 'localhost',
      port: 6379,
    },
    nfs: null, //use your own CND here
    enablePrivate: true, // enable private mode, only admin can publish, other use just can sync package from source npm
    admins: {
      admin: 'admin@cnpmjs.org',
    },
    syncModel: 'exist'
  };

安装依赖

make install

启动

; npm run start

Starting cnpmjs.org ...
Start nodejs success. PID=27175

好了,部署完成!

客户端设置

服务跑起来之后,企业员工需要在自己的电脑上配置下客户端。

首先安装cnpm客户端:

npm install -g cnpm

在自己的脚本的启动文件(例如.zshrc.bashrc)中添加别名:

echo "#lnpm alias\nalias lnpm='cnpm --registry=http://localhost:7001\
 --registryweb=http://localhost:7002\
 --cache=$HOME/.npm/.cache/lnpm\
 --userconfig=$HOME/.lnpmrc'" >> $HOME/.zshrc && source $HOME/.zshrc

注意用自己的仓库信息替换上面命令的相关部分。

之后就可以用lnpm命令访问企业的内部NPM了,各种接口和NPM一样。

注意,目前cnpm的权限控制比较简单,只有admin用户有权publishNPM模块。如果你的企业需要灵活的权限控制,需要自行开发。

参考


本文由SegmentFault根据 NodeParty 2013 上 @dead-horse 的分享整理


如果觉得我的文章对你有用,请随意赞赏

你可能感兴趣的

22 条评论
wayneli · 2016年12月02日

make install 应该 改成 npm install

+1 回复

0

我因为这个问题,倒腾了一天,才看出来。关键官网github上也是这样写的!!!https://github.com/cnpm/cnpmj...

water_liu · 2017年10月20日
Python发烧友 · 2013年12月25日

@2B码农死小马 的分享

回复

Python发烧友 · 2014年04月02日

快速搭建 Node.js 开发环境以及加速 npm http://cnodejs.org/topic/5338c5db7cbade005b023c98

回复

weakish 作者 · 2014年04月02日

赞!

(这篇可以转载么?

回复

Python发烧友 · 2014年04月02日

必须可以! 要不我直接发到这里吧

回复

weakish 作者 · 2014年04月02日

撒花欢迎~ (刚给乃开通了高级博客

回复

seawenzhu · 2014年05月19日

求救出现下面错误。
application.js
function *respond(next){
SyntaxError: unexpected token *

回复

weakish 作者 · 2014年05月19日

你是哪个版本,运行什么命令出现了错误?

回复

seawenzhu · 2014年05月19日

[root@localhost cnpmjs.org]# node --harmony dispatch.js

/opt/cnpmjs.org/node_modules/koa/lib/application.js:147
function *respond(next){
^
SyntaxError: Unexpected token *
at Module._compile (module.js:439:25)
at Object.Module._extensions..js (module.js:474:10)
at Module.load (module.js:356:32)
at Function.Module._load (module.js:312:12)
at Module.require (module.js:364:17)
at require (module.js:380:17)
at Object. (/opt/cnpmjs.org/node_modules/koa/index.js:2:18)
at Module._compile (module.js:456:26)
at Object.Module._extensions..js (module.js:474:10)
at Module.load (module.js:356:32)

node 版本是0.10.28 最新的, 系统是centos6.5,

回复

seawenzhu · 2014年05月19日

按照步骤重新做了一遍, node version v0.10.28, centos6.5 运行在windows8上的虚拟机。 出现如下错误。 高手帮忙看下 [root@localhost cnpmjs.org]# npm run start > cnpmjs.org@0.5.0 start /root/cnpmjs.org > ./bin/nodejsctl start && cp History.md docs/web/history.md Error: unrecognized flag --harmony-generators Try --help for options Starting cnpmjs.org ... nohup node --harmony-generators /root/cnpmjs.org/dispatch.js > /root/cnpmjs.org/.tmp/logs/nodejs_stdout.log 2>&1 & Start nodejs success. PID=29624 [root@localhost cnpmjs.org]#

回复

weakish 作者 · 2014年05月20日

“Start nodejs success. PID=29624”,有这条的话应该是已经成功了。“Error: unrecognized flag --harmony-generators” 这个错误应该不影响 cnpmjs 运行 (因为你的 node 版本是0.10.28 ,而 --harmony-generators 是 node 0.11.0+ 才支持的特性,所以会有报错,不过应该不影响使用。

回复

seawenzhu · 2014年05月20日

谢谢你的回复, 但是应该是没有部署成功,我在cnpmjs.org/.tmp/logs/nodejs_stdout.log 文件里看到了很多错误(SyntaxError: Unexpected token *), 而且我访问http://localhost:7001没有反应, 我晚上回去升级node, 再试试吧。

回复

weakish 作者 · 2014年05月20日

看了一下,发现现在最新版的 cnpmjs 要求 Node >=0.11.9 了!看来应该是 node 版本的问题。你可以升级 node。或者 用旧版的 cnpmjs https://github.com/cnpm/cnpmjs.org/releases/tag/0.2.27

回复

Enboga · 2014年09月11日

使用最新的cnpmjs.org 部署在红帽子系统,node 0.11.13
在cnpm publish的时候报错:
npm ERR! registry error parsing json
npm ERR! publish Failed PUT 500
npm ERR! SyntaxError: Unexpected token I
npm ERR! at Object.parse (native)
npm ERR! at RegClient. (c:\Users\Administrator\AppData\Roaming\np
m\node_modules\cnpm\node_modules\npm\node_modules\npm-registry-client\lib\reques
t.js:226:23)

这个是怎么回事?求解决方法

回复

weakish 作者 · 2014年12月22日

https://github.com/cnpm/cnpmjs.org/issues <-- 可以到这里问一下

回复

kzd666 · 2015年12月14日

顶起

回复

甘言川 · 2016年03月04日

@weakish 你好。
我运行npm run start 报错如下:
`[root@iZ28qt5vcnzZ cnpmjs.org]# npm run start

cnpmjs.org@2.8.0 start /root/cnpmjs.org
./bin/nodejsctl start && cp History.md docs/web/history.md

/root/cnpmjs.org/node_modules/fs-cnpm/index.js:40
Client.prototype.upload = function* (filepath, options) {

                              ^

SyntaxError: Unexpected token *

at exports.runInThisContext (vm.js:73:16)
at Module._compile (module.js:443:25)
at Object.Module._extensions..js (module.js:478:10)
at Module.load (module.js:355:32)
at Function.Module._load (module.js:310:12)
at Module.require (module.js:365:17)
at require (module.js:384:17)
at Object.<anonymous> (/root/cnpmjs.org/config/index.js:143:8)
at Module._compile (module.js:460:26)
at Object.Module._extensions..js (module.js:478:10)

Starting cnpmjs.org ...
nohup node /root/cnpmjs.org/dispatch.js > 2>&1 &
./bin/nodejsctl: line 38: $STDOUT_LOG: ambiguous redirect
Start nodejs success. PID=`

PID没有生成。我的node版本是:
`
[root@iZ28qt5vcnzZ cnpmjs.org]# node -v
v0.12.9
`
请问这个问题是什么原因导致的呢?

回复

zkai_q · 2016年09月28日

有两处貌似要换一下 一个是资源路径 git clone git://github.com/cnpm/cnpmjs.org.git $HOME/config.org 还有一处是配置文件哪里 cd config/index.js 除了要注释掉bindingHost一行,对外网开放之外,还要更改一下数据库链接的用户名和密码

回复

maoliangwu · 2016年10月31日

我的服务从外网同步完所有的包以后,其他的客户端registry到7001端口,无法install。由于是在公司内网的环境下,我看了cnpmjs还是会把这个请求redirect到外网的url上面。这是为什么呢

回复

黄键图 · 2017年03月10日

E:Gitcnpmjs.org>npm run start

cnpmjs.org@2.19.3 start E:Gitcnpmjs.org
./bin/nodejsctl start && cp History.md docs/web/history.md

'.' 不是内部或外部命令,也不是可运行的程序
或批处理文件。

npm ERR! Windows_NT 10.0.14393
npm ERR! argv "E:\nodejs\node.exe" "E:\nodejs\node_modules\npm\bin\npm-cli.js" "run" "start"
npm ERR! node v4.4.3
npm ERR! npm v2.15.1
npm ERR! code ELIFECYCLE
npm ERR! cnpmjs.org@2.19.3 start: ./bin/nodejsctl start && cp History.md docs/web/history.md
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the cnpmjs.org@2.19.3 start script './bin/nodejsctl start && cp History.md docs/web/history.md'.
npm ERR! This is most likely a problem with the cnpmjs.org package,
npm ERR! not with npm itself.
npm ERR! Tell the author that this fails on your system:
npm ERR! ./bin/nodejsctl start && cp History.md docs/web/history.md
npm ERR! You can get information on how to open an issue for this project with:
npm ERR! npm bugs cnpmjs.org
npm ERR! Or if that isn't available, you can get their info via:
npm ERR!
npm ERR! npm owner ls cnpmjs.org
npm ERR! There is likely additional logging output above.

npm ERR! Please include the following file with any support request:
npm ERR! E:Gitcnpmjs.orgnpm-debug.log

这是为什么啊

回复

载入中...