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. tts和字符集的关系--要求源和目的端的数据库字符集必须一样,国家字符集必须一样。

    tts和字符集的关系--要求源和目的端的数据库字符集必须一样,国家字符集必须一样. imp sys/as TRANSPORT_TABLESPACE=Y datafiles= C:\oracle\pro ...

  2. AAuto如何设置字体大小

    在代码视图中(按钮呈现的是设计视图,你再按一下就切换成代码视图了)可以设置缩放比率,右下角也可以设置字体大小   如果你的"设计视图"是灰色不可点击,那是因为你的代码根本没有按钮, ...

  3. FreeMark的list应用

    语法:<#if></#if>后台传送List,前台html页面中获取该list并显示: <#if userList?exists> <#list userLi ...

  4. 使用Hadoop自己的类操作HDFS

    package hdfs; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.I ...

  5. 使用matlab进行mex编译时的路径问题mexopts

            matlab和vs 进行混合编程时总须要使用matlab编译mexFunction.cpp文件. 这些文件免不了使用include下的*.h和lib下的*.lib文件.举例说明.这次我 ...

  6. 应用程序之SingleViewApplication

    理论概念学习 iOS运行原理 代码结构分析 代码初步实现 一.理论学习 1⃣️.每一个应用程序都有属于自己的UIWindow,继承自UIView 2⃣️.每一个满屏的UIView都由一个UIViewC ...

  7. git stash 保存当前工作状态

    1. git stash   暂存当前工作状态 2. git stash list 查看暂存列表 3. git stash save 'title' 暂存工作状态并添加说明 4. git stash ...

  8. mycat可以干什么

     单纯的读写分离,此时配置最为简单,支持读写分离,主从切换 分表分库,对于超过 1000 万的表进行分片,最大支持 1000 亿的单表分片 多租户应用,每个应用一个库,但应用程序只连接 Myca ...

  9. GIT简单使用——多人协作篇

    多人协作的工作模式通常是这样:1.首先,可以试图用git push origin <branch-name>推送自己的修改:2.如果推送失败,则因为远程分支比你的本地更新,需要先用git ...

  10. Idftp.DirectoryListing 里面的内容为什么会是空的呢?(转)

    最近在项目中要用到FTP上传,用的是delphi的IdFTP控件,用IdFtp.List(list),发现List里面有内容,可 是到IdFtp.DirectoryListing.Items[iCou ...