cnpm 是企业内部搭建 npm 镜像和私有 npm 仓库的开源方案,当企业业务逻辑相关的模块可能不适合开源。这部分私有的模块就可以放在私有 npm 仓库中来管理和维护。 以下为搭建私有 npm 的详细步骤,这里使用了由阿里的团队开源的 [cnpmjs.org][href1] ,主要分为 Server 端的配置和 Client 的配置:

Server

Server 端主要有 cnpm, mysql, nginx 的配置。

环境:

```# system
$ cat /etc/redhat-release
CentOS Linux release 7.1.1503 (Core)

node

$ node -v

v6.9.1

npm

$ npm -v

3.10.9

nginx

$ nginx -v

nginx version: nginx/1.9.9

mysql

$ mysql -u yourname -p

$ mysql> \s;

Server version: 5.5.38-log MySQL Community Server (GPL)

server ip

192.168.33.10


<h3>安装:</h3>
```# clone from github
$ git clone git://github.com/cnpm/cnpmjs.org.git $HOME/cnpmjs.org
$ cd $HOME/cnpmjs.org # init mysql
$ mysql -u yourname -p
mysql&gt; create database cnpmjs;
mysql&gt; use cnpmjs;
mysql&gt; source docs/db.sql

配置:

```$ pwd
/home/xxx/cnpmjs.org

$ vim config/config.js



module.exports = {

debug: false,

// 添加自己的私有前缀,可以有多个,必填

scopes: ['@test'],

enableCluster: true,

// mysql,必填

database: {

db: 'cnpmjs',

username: 'username',

password: 'password',

dialect: 'mysql',

host: '192.168.33.10',

port: 3306,

pool: {

maxConnections: 10,

minConnections: 0,

maxIdleTime: 30000

},

logging: !!process.env.SQL_DEBUG,

},

mail: {

enable: false,

appname: 'appname',

from: 'from',

service: 'service',

auth: {

user: 'user',

pass: 'pass'

}

},

// 日志目录,cnpm 的运行日志,必填

logdir: '/data/logs/cnpm/node_logs/',

nfs: require('fs-cnpm')({

// package 存放目录,必填

dir: '/data/logs/cnpm/node_nfs/',

}),

// 上传目录,必填

uploadDir: '/data/logs/cnpm/node_modules/',

enablePrivate: true,

// 注册域名,必填

registryHost: 'registry.cnpm.xx.com',

// 可以 publish package 的用户,必填

admins: {

admin: 'admin'

},

// 同步官方包的模式,必填

syncModel: 'exist', // 'none', 'all', 'exist'

// package 的大小

jsonLimit: 1073741824,

// 不在 cnpm 管理的有私有前缀的 package 的白名单

privatePackages: ['@remobild/react-native-toast']

};

$ vim config/index.js

注释掉 bindingHost,对外网开放,否则只能本机提交

bindingHost: ''

注意 syncModel 不建议写 all, all 模式下会同步整个官方仓库,需要很大的存储空间

确保 logdir, nfsdir, uploadDir 目录权限可写

package 的大小,看自己的包情况,如果有特别大的 package,并且通过 nginx 代理了,那么除了 jsonLimit 外,nginx 的 client_max_body_size 也要修改


<h3>安装依赖:</h3>
```$ npm install --build-from-source --registry=https://registry.npm.taobao.org --disturl=https://npm.taobao.org/mirrors/node

启动:

```# debug 模式
$ npm run dev

后台启动

$ npm start

检查 registry

$ curl http://192.168.33.10:7001

检查 web

$ curl http://192.168.33.10:7002

以上的两个端口也可以通过 config.js 修改,默认的 7001 和 7002 写在 config/index.js 中


<h3>nginx: (<em>这一步非必须,后边 client 直接用 ip 也可以</em>)</h3>
<h4>cnpm.xx.com</h4>
```upstream cnpm {
server 127.0.0.1:7002;
} server {
listen 80;
server_name cnpm.xx.com; location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_pass http://cnpm/;
proxy_redirect off;
}
}

registry.cnpm.xx.com

```upstream registry_cnpm {
server 127.0.0.1:7001;
}

server {

listen 80;

server_name registry.cnpm.xx.com;

location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_pass http://registry_cnpm/;
proxy_redirect off;
}

}


<p>至此,Server 端的配置就完成了,在本地绑定 host 访问 cnpm.xx.com 就可以看见自己的 npm 仓库了。</p>
<h2>Client</h2>
<p>Client 端主要是配置命令行工具完成注册,登录等步骤后,就可以发布 package 到自己的 npm 仓库中了。</p>
<h3>安装 cnpm:</h3>
```# cnpm 官方有自己的 cnpm 命令,但是在我们的实际使用过程中,发生过一些问题,之后采用了给 npm 官方命令添加别名的方式
$ echo -e '\n#alias for cnpm\nalias cnpm="npm --registry=http://registry.cnpm.xx.com --cache=$HOME/.npm/.cache/cnpm --disturl=http://xx.com --userconfig=$HOME/.cnpmrc"' &gt;&gt; ~/.bashrc &amp;&amp; source ~/.bashrc

配置:

```1. 配置 cnpmrc
$ vim ~/.cnpmrc
registry=http://registry.cnpm.xx.com

  1. 注册

    (注册前需要把要注册的人的邮箱前缀发给管理员, 管理员在上边的 config.js 中添加完毕之后才可以)

    $ cnpm adduser

    依次输入用户,密码,邮箱

  2. 登录

    $ cnpm login

    没有错误表示登录成功


<h3>使用:</h3>
```# publish package
$ mkdir test &amp;&amp; cd test
$ cnpm init -y
$ touch test.js
$ cnpm publish # install package
$ cnpm install @test/test --save

以上是 Client 端的配置过程,还是很简单的。

通过上边的 Server 端和 Client 端的配置,我们就可以在自己公司内发布一些不便公开的 package 到自己的 npm 仓库中。另外,cnpm 也是可以安装官方仓库的 package 的,安装过程中 cnpm 会到自己的仓库中寻找要安装的 package , 找不到的情况下会默认到 https://npm.taobao.org 寻找,这是阿里团队维护的一个完整 https://www.npmjs.com 镜像,同步频率目前为10分钟一次,以保证尽量与官方服务同步。

来源:https://segmentfault.com/a/1190000016705302

私有 npm 仓库的搭建的更多相关文章

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

    cnpm是企业内部搭建npm镜像和私有npm仓库的开源方案.它同时解决了现有npm架构的一些问题. 为什么企业需要私有NPM 主要有如下理由: 确保npm服务快速.稳定:对于企业来说,上线生产系统的时 ...

  2. 使用Sinopia搭建私有npm仓库

    使用Sinopia搭建私有npm仓库 在用npm装包的时候,每次都要下载一大堆,慢且不说,npm还老被墙,所以就想到在公司内部搭建npm仓库镜像.大概看了几个,觉得Sinopia最简单也好用,所以就使 ...

  3. 怎么在 CentOS 6 上配置私有 NPM 仓库?

    Sinopia 是一个简单易用的私有 NPM 仓库服务器.在 CentOS 6 上安装时,遇到如下报错(Node 版本 6.9.1) #error This version of node/NAN/v ...

  4. Docker 私有镜像仓库的搭建及认证

    DockerHub 为我们提供了很多官方镜像和个人上传的镜像,我们可以下载机构或个人提供的镜像,也可以上传我们自己的本地镜像,但缺点是: 由于网络的原因,从 DockerHub 下载和上传镜像速度可能 ...

  5. 使用Sinopia部署私有npm仓库

    使用Sinopia部署私有npm仓库 [root@localhost ~]# hostnamectl set-hostname --static npm-server [root@npm-server ...

  6. 使用cnpm搭建私有NPM仓库 发布npm包

    关于如何使用cnpm搭建私有的npm仓库看这里→ http://blog.fens.me/nodejs-cnpm-npm/ 我本人还没有机会真正实践操作过,公司的npm仓库是我老大搭建的,我这里仅仅记 ...

  7. harbor私有镜像仓库的搭建与使用与主从复制

    harbor私有镜像仓库,私有仓库有两种,一种是harbor,一种是小型的私有仓库,harbor有两种模式,一种是主 从,一种是高可用仓库,项目需求,需要两台服务器,都有docker.ldap权限统一 ...

  8. docker实战——Docker本地私有镜像仓库Harbor搭建及配置

    Harbor介绍 Docker容器应用的开发和运行离不开可靠的镜像管理,虽然docker官方提供了公共的镜像仓库(Docker Hub),但是从安全和效率等方面考虑,部署我们私有环境内的Registr ...

  9. nexus 私有 maven 仓库的搭建

    下载地址 页面 : https://help.sonatype.com/repomanager3/download 首先需要安装jdk .安装棒法我 前面的文章有写.https://www.cnblo ...

随机推荐

  1. AlphaGo GITHUB

    AlphaGo GITHUB https://github.com/Rochester-NRT/AlphaGo

  2. vim学习记录(转)

    基本功 Vim有三种模式: 导航(navigation)模式. 这时候,字母就是上下左右键. 输入模式.这时候,你按字母键,才会输入字母. 命令模式.需要先输入":" 冒号,才会进 ...

  3. 服务器启动之后运行脚本在/etc/rc.d/rc.local中配置

    服务器启动之后运行脚本在/etc/rc.d/rc.local中配置 # ! /bin/sh # 启动svn /usr/bin/svnserve -d -r /var/svnroot/

  4. pkav之当php懈垢windows通用上传缺陷

    $pkav->publish{当php懈垢windows}剑心@xsser抛弃了我,但我却不能抛弃乌云..php懈垢windows,就像男人邂逅女人,早晚都会出问题的..感谢二哥@gainove ...

  5. vue1和vue2获取dom元素的方法 及 nextTick() 、$nextTick()

    vue1.*版本中 在标签中加上el='dom',然后在代码中this.$els.dom这样就拿到了页面元素 例如:<div class='box' el='myBox'>你好</d ...

  6. cocos2dx3.x使用cocostudio触摸事件不响应的奇葩问题

    刚刚使用3.1,发现了一些关于触摸的不同之处,对于习惯于2.x的人还是认为坑啊,简单总结一下: 使用cocostudio加进来的ui,当某个可触但不可见的时候,给他加入不论什么触摸监听事件都是依照不可 ...

  7. window.close关闭当前页面

    浏览器处于安全策略考虑,只允许Javascript关闭由javascript打开的页面,为了用js关闭当前窗口,我们可以这么考虑,这也是最常用的做法. <a href="javascr ...

  8. Objective-C 执行AppleScript脚本

    在Objective-C里事实上也能够执行AppleScript 第一种方式是Source 将脚本写到变量字符串里 NSAppleEventDescriptor *eventDescriptor = ...

  9. 如何创建RESTFul Web服务

    想写这篇文章很久了,这是个大话题,不是一时半会就能说清楚的. 所以准备花个一星期整理资料,把思路理清楚,然后再在Team里做个sharing:) 其实RESTFul是架构风格,并不是实现规范,也不一定 ...

  10. python etree解析xml

    # -*- coding:utf-8 -*- #conding:utf-8 __author__ = 'hdfs' ''' 简洁 高效 明了 ElementTree轻量级的 Python 式的 API ...