带你搭建cnpm仓库

前言

基于前面的了解或者公司内部的刚需,可能搭建cnpm仓库已经变成了你必须会的知识点。跟着我一起去服务器部署一个私有的cnpm仓库吧。

环境要求

  • 系统要求:mac或者linux(服务器基本都是linux的)
  • nodejs:4.2.3 以上版本

基本安装

  • nodejs

    curl -sL https://rpm.nodesource.com/setup_7.x | bash -  (脚本)
    yum install -y nodejs
    yum install -y gcc-c++ make
    复制代码
  • 安装mysql

  1. 检测并卸载已有的

      rpm -qa | grep mariadb
      rpm -e --nodeps mariadb/mysql
    复制代码
  2. 安装mysql-server 2.1 在/etc/yum.repos.d/目录创建MariaDB.repo文件,内容如下:

     # MariaDB 5.5 CentOS repository list - created 2014-03-04 11:20 UTC  
    # http://mariadb.org/mariadb/repositories/  
    [mariadb]  
    name = MariaDB  
    baseurl = http://yum.mariadb.org/5.5/centos6-amd64  
    gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB  
    gpgcheck=1 
    复制代码

    2.2 安装对应包

      sudo yum -y install mariadb-server MariaDB-client
    复制代码

    2.3 启动服务

    //如果你是centos 系统
    systemctl start mariadb.service
    //如果你是GUN/linux ,只有service服务
    service mysql start
    //修改数据库密码,默认是空的
    mysqladmin -u root password "passwd"
    复制代码

    2.4 相关命令的拓展

    //centos 系统
    systemctl start mariadb #启动服务
    systemctl enable mariadb #设置开机启动
    systemctl restart mariadb #重新启动
    systemctl stop mariadb.service #停止MariaDB
    // gun
    service xxxx start/stop/enable/restart
    复制代码
  • 安装git并检出cnpmjs项目

    //安装git 下载cnpmjs的git项目 
     yum install git
     git clone git://github.com/fengmk2/cnpmjs.org.git $HOME/cnpmjs.org
     cd cnpmjs.org
    //用户登陆 修改相关的库表信息
     Mysql -u root -p
     create database cnpmjs;
     use cnpmjs;
    source docs/db.sql【db.sql位于cnpmjs.org/docs/db.sql】
    //允许外部链接数据库(如果 你想查看数据库的情况有必要设置)
    grant all privileges on *.* to root@'%' identified by 'password';
    //根据自己的需要修改index的配置文件
    vim config/index.js 
    复制代码

使用须知

  • cnpm提供两个端口:7001和7002,其中7001用于NPM的注册服务,7002用于Web访问。

  • bindingHost为安装cnpm的服务器ip地址,也就是在浏览器中只能通过访问http://192.168.0.234来访问cnpm以及获取npm的注册服务。 修改本地下载地址(registryHost:r.cnpmjs.org修改为192.168.0.129:7001)

  • 安装依赖

    //持久使用
    npm config set registry https://registry.npm.taobao.org
    // 配置后可通过下面方式来验证是否成功
    npm config get registry// 或
    npm info express
    //进入./cnpmjs.org,执行npm install
    npm install
    复制代码
  • 启动服务 node dispatch.js或者“nohup node dispatch.js &”来启动。 其中nohup为在后台启动。

    npm run dev:调试模式启动;
    npm run test:跑测试;
    npm run start:启动 CNPM;永久的热启动
    npm run status:查看 CNPM 启动状态;
    npm run stop:停止 CNPM。
    复制代码
  • 如果启动时报错:/lib64/libc.so.6: versionGLIBC_2.14' not found,这个是因为glibc版本过低引起的,你可以通过命令查看目前支持的版本:strings /lib64/libc.so.6 |grep GLIBC ` ,解决办法从官网下载相关的压缩包然后编译安装,再配置到相关的目录下。

  1. 找到官网:http://www.gnu.org/software/libc/,下载2.14版本后缀为gz的压缩包,我们下载后放到root/software 下
  2. 剩下的都是命令行操作
    //解压
    [root@jrgc130 ~]#tar zxf glibc-2.14.tar.gz
    [root@jrgc130 ~]# cd /opt/software
    [root@jrgc130 software]# tar xf glibc-2.14.tar.gz
    [root@jrgc130 software]# cd glibc-2.14
    [root@jrgc130 glibc-2.14]# mkdir build
    [root@jrgc130 glibc-2.14]# cd build
    //修改配置文件
    [root@jrgc130 build]# ../configure --prefix=/usr/local/glibc-2.14
    //安装
    [root@jrgc130 build]# make -j4
    [root@jrgc130 build]# make install
    //拷贝链接库
    [root@jrgc130 build]# cd /usr/local/glibc-2.14/lib
    [root@jrgc130 lib]# cp libc-2.16.so /lib64/
    //创建链接
    [root@jrgc130 lib]# cd /lib64
    [root@jrgc130 lib64]# rm -rf libc.so.6
    //复制相关文件到so
    [root@example lib64]# /sbin/sln libc-2.14.so /lib64/libc.so.6
    //运行strings /lib64/libc.so.6 |grep GLIBC 可以查看最新支持版本为2.14,问题解决。
    复制代码
  • 测试是否启动成功

    在浏览器中输入:http://192.168.0.234:7002/,如果出现:
    发布私有包
    npm config set registry https://registry.npm.taobao.org
    安装cnpm客户端
    curl -sL https://rpm.nodesource.com/setup_7.x | bash -  (脚本)
    yum install -y nodejs
    sudo npm install cnpm -g
    更改默认的registry,指向私有的registry
    cnpm set registry http://192.168.0.234:7001
    复制代码
  • 用npm账号登录你的私有registry 这里的账号中www.npmjs.com的账号,没有请注册(admin登录)

    $ cnpm login
    Username: admin
    Password: npm0816@zjkj.com
    Email: (this IS public) admin@cnpmjs.org
    复制代码
  • 如果过程中遇到不能同步或者下载自己的模块 ,可以修改/config/index.js 文件

    enableAbbreviatedMetadata: true

创建私有测试包

  • 生成测试包

    $ cd /tmp
    $ mkdir helloworld && cd helloworld
    $ cnpm init
    name: @cjt/helloworld
    version: 1.0.0
    复制代码
  • 生成package.json(产出文件) :

    {
      "name": "@cjt/helloworld",
      "version": "1.0.0",
      "description": "my first scoped package",
      "main": "index.js",
      "scripts": {
        "test": "echo \"Error: no test specified\" && exit 1"
      },
      "author": "",
      "license": "ISC"
    }
    复制代码
  • 注意事项

  1. 注意,包名helloworld前必须要以公司名@cjt为前缀, @cjt在 config/index.js的scopes中配置

      // registry scopes, if don't set, means do not support scopes,你可以设置为kkl
      scopes: [ '@cjt','@cnpm', '@cnpmtest', '@cnpm-test' ],
    复制代码
  2. 其余管理员账号权限分配必须二次开发,修改 middleware/publishable.js ,也可以直接修改index.js中的文件,默认的管理员是admin ;

  3. 注册并登陆用户:

  4. 发布与同步(见cnpm入门)

    发布
    cnpm publish
    通过浏览器访问:http://192.168.0.129:7002/ 可查看和操作私有CNPM服务器
    从默认源同步gulp
    cnpm sync gulp
    下载
    cnpm install gulp
    复制代码

配置文件(config/index.js) 

 'use strict';

 var mkdirp = require('mkdirp');
 var copy = require('copy-to');
 var path = require('path');
 var fs = require('fs');
 var os = require('os');

 var version = require('../package.json').version;

 var root = path.dirname(__dirname);
 var dataDir = path.join(process.env.HOME || root, '.cnpmjs.org');

 var config = {
   version: version,
   dataDir: dataDir,

   /**
    * Cluster mode 是否启用 cluster-worker 模式启动服务,默认 false,生产环节推荐为 true; 利用多核
    */
   enableCluster: true,
   numCPUs: os.cpus().length,

   /*
    * server configure  服务器的基本设置,ip以及请求以及访问端口(必须设置)
    */

   registryPort: 7001,
   webPort: 7002,
   bindingHost: '10.0.0.141', // only binding on 127.0.0.1 for local access

   // debug mode
   // if in debug mode, some middleware like limit wont load
   // logger module will print to stdout
   debug: process.env.NODE_ENV === 'development',
   // page mode, enable on development env
   pagemock: process.env.NODE_ENV === 'development',
   // session secret
   sessionSecret: 'cnpmjs.org test session secret',
   // max request json body size
   jsonLimit: '10mb',
   // log dir name
   logdir: path.join(dataDir, 'logs'),
   // update file template dir
   uploadDir: path.join(dataDir, 'downloads'),
   // web page viewCache
   viewCache: false,

   // config for koa-limit middleware
   // for limit download rates
   limit: {
     enable: false,
     token: 'koa-limit:download',
     limit: 1000,
     interval: 1000 * 60 * 60 * 24,
     whiteList: [],
     blackList: [],
     message: 'request frequency limited, any question, please contact fengmk2@gmail.com',
   },

   enableCompress: false, // enable gzip response or not

   // default system admins,(管理员必须设置为自己清楚的,只有管理员可以删除模块,配置需要重启)
   admins: {
     // name: email
     fengmk2: 'fengmk2@gmail.com',
     admin: 'admin@cnpmjs.org',
     dead_horse: 'dead_horse@qq.com',
   },

   // email notification for errors
   // check https://github.com/andris9/Nodemailer for more informations
   mail: {
     enable: false,
     appname: 'cnpmjs.org',
     from: 'cnpmjs.org mail sender <adderss@gmail.com>',
     service: 'gmail',
     auth: {
       user: 'address@gmail.com',
       pass: 'your password'
     }
   },

   logoURL: 'https://os.alipayobjects.com/rmsportal/oygxuIUkkrRccUz.jpg', // cnpm logo image url
   adBanner: '',
   customReadmeFile: '', // you can use your custom readme file instead the cnpm one
   customFooter: '', // you can add copyright and site total script html here
   npmClientName: 'cnpm', // use `${name} install package`,(默认的安装命令符号)
   packagePageContributorSearch: true, // package page contributor link to search, default is true

   // max handle number of package.json `dependencies` property
   maxDependencies: 200,
   // backup filepath prefix
   backupFilePrefix: '/cnpm/backup/',

   /**
    * database config(数据库配置文件,必须设置的)
    */

   database: {
     db: 'cnpmjs',
     username: 'root',
     password: 'kkl123456',

     // the sql dialect of the database
     // - currently supported: 'mysql', 'sqlite', 'postgres', 'mariadb'
     dialect: 'mariadb',

     // custom host; default: 127.0.0.1
     host: '127.0.0.1',

     // custom port; default: 3306
     port: 3306,

     // use pooling in order to reduce db connection overload and to increase speed
     // currently only for mysql and postgresql (since v1.5.0)
     pool: {
       maxConnections: 10,
       minConnections: 0,
       maxIdleTime: 30000
     },

     // the storage engine for 'sqlite'
     // default store into ~/.cnpmjs.org/data.sqlite
     storage: path.join(dataDir, 'data.sqlite'),

     logging: !!process.env.SQL_DEBUG,
   },

   // package tarball store in local filesystem by default(文件系统,可以默认,可以用其他云服务器)
   nfs: require('fs-cnpm')({
     dir: path.join(dataDir, 'nfs')
   }),
   // if set true, will 302 redirect to `nfs.url(dist.key)`
   downloadRedirectToNFS: false,

   // registry url name(模块下载请求地址,必须设置)
   registryHost: '10.0.0.141:7001',

   /**
    * registry mode config
    */

   // enable private mode or not(必须设置,false允许其他人发布,否则只有管理员)
   // private mode: only admins can publish, other users just can sync package from source npm
   // public mode: all users can publish
   enablePrivate: false,

   // registry scopes, if don't set, means do not support scopes(私有模块前缀,必须设置)
   scopes: [ '@kkl'],

   // some registry already have some private packages in global scope
   // but we want to treat them as scoped private packages,
   // so you can use this white list.
   privatePackages: [],

   /**
    * sync configs
    */

   // the official npm registry(官方请求地址,一般不用修改)
   // cnpm wont directly sync from this one
   // but sometimes will request it for some package infomations
   // please don't change it if not necessary
   officialNpmRegistry: 'http://registry.npm.taobao.org',
   officialNpmReplicate: 'https://replicate.npmjs.com',

   // sync source, upstream registry(同步模块的地址,设置为阿里镜像建议)
   // If you want to directly sync from official npm's registry
   // please drop them an email first
   sourceNpmRegistry: 'http://registry.npm.taobao.org',

   // upstream registry is base on cnpm/cnpmjs.org or not
   // if your upstream is official npm registry, please turn it off
   sourceNpmRegistryIsCNpm: true,

   // if install return 404, try to sync from source registry(模块没有,从远程更新下载,必须设置)
   syncByInstall: true,

   // sync mode select(同步模式,同步已有模块即可)
   // none: do not sync any module, proxy all public modules from sourceNpmRegistry
   // exist: only sync exist modules
   // all: sync all modules
   syncModel: 'exist', // 'none', 'all', 'exist'

   syncConcurrency: 1,
   // sync interval, default is 10 minutes(10ms同步一次)
   syncInterval: '10m',

   // sync polular modules, default to false(不同步热门模块)
   // because cnpm can't auto sync tag change for now
   // so we want to sync popular modules to ensure their tags
   syncPopular: false,
   syncPopularInterval: '1h',
   // top 100
   topPopular: 100,

   // sync devDependencies or not, default is false
   syncDevDependencies: false,

   // changes streaming sync
   syncChangesStream: false,
   handleSyncRegistry: 'http://127.0.0.1:7001',

   // badge subject on http://shields.io/
   badgePrefixURL: 'https://img.shields.io/badge',
   badgeSubject: 'cnpm',

   // custom user service, @see https://github.com/cnpm/cnpmjs.org/wiki/Use-Your-Own-User-Authorization
   // when you not intend to ingegrate with your company's user system, then use null, it would
   // use the default cnpm user system
   userService: null,

   // always-auth https://docs.npmjs.com/misc/config#always-auth
   // Force npm to always require authentication when accessing the registry, even for GET requests.
   alwaysAuth: false,

   // if you're behind firewall, need to request through http proxy, please set this
   // e.g.: `httpProxy: 'http://proxy.mycompany.com:8080'`
   httpProxy: null,

   // snyk.io root url
   snykUrl: 'https://snyk.io',

   // https://github.com/cnpm/cnpmjs.org/issues/1149(针对某个补丁文件的修复,必须设置)
   // if enable this option, must create module_abbreviated and package_readme table in database
   enableAbbreviatedMetadata: true,

   // global hook function: function* (envelope) {}
   // envelope format please see https://github.com/npm/registry/blob/master/docs/hooks/hooks-payload.md#payload
   globalHook: null,
 };

 if (process.env.NODE_ENV === 'test') {
   config.enableAbbreviatedMetadata = true;
 }

 if (process.env.NODE_ENV !== 'test') {
   var customConfig;
   if (process.env.NODE_ENV === 'development') {
     customConfig = path.join(root, 'config', 'config.js');
   } else {
     // 1. try to load `$dataDir/config.json` first, not exists then goto 2.
     // 2. load config/config.js, everything in config.js will cover the same key in index.js
     customConfig = path.join(dataDir, 'config.json');
     if (!fs.existsSync(customConfig)) {
       customConfig = path.join(root, 'config', 'config.js');
     }
   }
   if (fs.existsSync(customConfig)) {
     copy(require(customConfig)).override(config);
   }
 }

 mkdirp.sync(config.logdir);
 mkdirp.sync(config.uploadDir);

 module.exports = config;

 config.loadConfig = function (customConfig) {
   if (!customConfig) {
     return;
   }
   copy(customConfig).override(config);
 };
复制代码

参考测试文档

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值