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

cnpm

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

为什么企业需要私有NPM

主要有如下理由:

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

cnpm的特点

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

5分钟部署

部署cnpm只需5分钟。

依赖

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

部署过程

获取代码

<span class="hljs-title">git</span> clone <span class="hljs-url">git://github.com/fengmk2/cnpmjs.org.git</span> <span class="hljs-variable">$HOME</span>/cnpmjs.org
cd <span class="hljs-variable">$HOME</span>/cnpmjs.org
`</pre>
创建MySQL表
<pre class="hljs php">`; mysql -u yourname -p
mysql&gt; <span class="hljs-keyword">use</span> <span class="hljs-title">cnpmjs</span>;
mysql&gt; source docs/db.sql
`</pre>
然后编写配置文件`config/config.js`:
<pre class="hljs javascript">`<span class="hljs-built_in">module</span>.exports = {
    debug: <span class="hljs-literal">false</span>,
    enableCluster: <span class="hljs-literal">true</span>, <span class="hljs-comment">// enable cluster mode</span>
    mysqlServers: [
      {
        host: <span class="hljs-string">'localhost'</span>,
        port: <span class="hljs-number">3306</span>,
        user: <span class="hljs-string">'cnpmjs'</span>,
        password: <span class="hljs-string">'cnpmjs123'</span>,
      }
    ],
    mysqlDatabase: <span class="hljs-string">'cnpmjstest'</span>,
    redis: {
      host: <span class="hljs-string">'localhost'</span>,
      port: <span class="hljs-number">6379</span>,
    },
    nfs: <span class="hljs-literal">null</span>, <span class="hljs-comment">//use your own CND here</span>
    enablePrivate: <span class="hljs-literal">true</span>, <span class="hljs-comment">// enable private mode, only admin can publish, other use just can sync package from source npm</span>
    admins: {
      admin: <span class="hljs-string">'admin@cnpmjs.org'</span>,
    },
    syncModel: <span class="hljs-string">'exist'</span>
  };
`</pre>
安装依赖
<pre class="hljs sql">`make <span class="hljs-operator"><span class="hljs-keyword">install</span>
</span>`</pre>
启动
<pre class="hljs sql">`; npm run <span class="hljs-operator"><span class="hljs-keyword">start</span>

<span class="hljs-keyword">Starting</span> cnpmjs.org ...
<span class="hljs-keyword">Start</span> nodejs success. PID=<span class="hljs-number">27175</span>
</span>`</pre>
好了,部署完成!

### 客户端设置

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

首先安装cnpm客户端:
<pre class="hljs coffeescript">`<span class="hljs-built_in">npm</span> install -g cnpm
`</pre>
在自己的脚本的启动文件(例如`.zshrc`或`.bashrc`)中添加别名:
<pre class="hljs bash">`<span class="hljs-built_in">echo</span> <span class="hljs-string">"#lnpm alias\nalias lnpm='cnpm --registry=http://localhost:7001\
 --registryweb=http://localhost:7002\
 --cache=<span class="hljs-variable">$HOME</span>/.npm/.cache/lnpm\
 --userconfig=<span class="hljs-variable">$HOME</span>/.lnpmrc'"</span> &gt;&gt; <span class="hljs-variable">$HOME</span>/.zshrc &amp;&amp; <span class="hljs-built_in">source</span> <span class="hljs-variable">$HOME</span>/.zshrc

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

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

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

参考


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

Share Comments