## fork from jne

## jiulvxing node 开发解决方案

让你只专注在业务和展现

项目地址：<http://gitlab.corp.jiulvxing.com:88/fe/jne-cli>
使用文档：<https://tower.im/projects/7a14e057a07a43948352903af22ecdc4/docs/4102997dfd2e42ccb6fdc4541de86e6d/>

* [本地安装](#local)
* [命令支持](#command)
* [创建jne工程](#create)
* [服务器端安装](#server)
* [服务器web环境配置](#config)
* [模块](#modules)
    * [q-version (qzz版本号管理)](#qversion)
    * [q-template (模板系统)](#qtemplate)
    * [q-logger (日志系统)](#qlogger)
    * [q-exception (异常捕获)](#qexception)
    * [q-healthcheck](#qhealthcheck)
    * [q-monitor (监控系统)](#qmonitor)
    * [q-multiprocess (多进程管理)](#qmultiprocess)

<a name="local"></a>
###  本地安装

    npm install jne -g --registry=http://registry.npm.taobao.org

其他包依赖公司内部的npm源，你需要先安装qnpm，安装方式

通过alias命令

    alias qnpm="npm --registry=http://registry.npm.corp.qunar.com/ --cache=$HOME/.npm/.cache/qnpm --userconfig=$HOME/.qnpmrc"

或者在`~/.bash_profile`或`~/.zshrc`中增加如下配置:

    # alias for qnpm
    alias qnpm="npm --registry=http://registry.npm.corp.qunar.com/ --cache=$HOME/.npm/.cache/qnpm --userconfig=$HOME/.qnpmrc"

然后运行：

    source ~/.bash_profile # base环境
    source ~/.zshrc # zsh环境

<a name="command"></a>
### 命令支持

    jne 使用说明
    ===========================
    jne init 初始化一个项目
    jne dev 启动项目本地服务
    jne initserver [-w <webappFoler> -s <serviceName>] 服务器目录和服务初始化
    jne initschema qdr发布系统schema初始化
    jne remote -r <serverlist> -c <remoteCommand> 远程执行命令
    jne sync [server] 同步文件到服务器

<a name="create"></a>
### 如何创建一个jne工程

    1. 在项目目录里执行 `jne init`
    2. 运行 `qnpm install`
    3. 运行 `bin/dev`

<a name="server"></a>
### 服务器安装

1. 新申请的服务器，在申请服务器时可以选择预装QXF，这样就不用到服务器上做任何安装了
2. 如果是原来的服务器或者申请的时候忘了选择预装，需要执行一下步骤安装：

    1. ssh 登录服务器
    2. 运行 `sudo yum install q-node`
    3. 运行 `sudo npm install jne -g --registry=http://registry.npm.taobao.org`

<a name="config"></a>
### 服务器web环境配置

配置web环境有如下三种方式（推荐使用第3种方式配置）：

1. ssh 登录服务器，执行 `sudo jne initserver`按照提示输入所需参数，或者执行 `sudo jne initserver -w <web目录名称> -s <service名称>`

2. 在本地可以ssh登录到服务器的终端执行

        jne remote -r '<服务器列表>' -c 'sudo jne initserver -w <webappFolder> -s <serverName>'

3. 按照说明配置工程里的package.json中的schema内容，在本地可以ssh登录到服务器的终端执行

        jne initserver --config

服务器列表支持格式：

    l-home[m-n].fe.cn5
    l-home[x,y,z].fe.cn5
    l-home[m-n].fe.cn5,l-home[x,y,z].fe.cn5,...

<a name="modules"></a>
## 包含模块

<a name="qversion"></a>
### qzz版本号 @qnpm/q-version
---
使用

    var qversion = require('@qnpm/q-version');
    // 初始化版本号
    qversion.parse(path.join(__dirname, 'refs')); // 参数为ver目录所在路径

<a name="qtemplate"></a>
### 模板 @qnpm/q-template
---
使用

    var qtemplate = require('@qnpm/q-template');

    // 设置模板引擎
    qtemplate(app, {
      views: __dirname + "/views", // 总模板目录
      layouts: 'layouts', // layout模板目录，默认views/layouts
      versions: qversion.versions()
    });

[模板使用详尽说明及接口](qtemplate)

<a name="qlogger"></a>
### 日志 @qnpm/q-logger

日志组件支持多进程工程，由主进程统一负责记录日志，支持不同的路由记录不同的日志文件，配置如下：

    {
        logFiles: [
            {
                type: 'track', // 名称
                route: ['/track.htm', '/timetrack.htm'], // 路由，支持express风格路由
                appenders: [ // log4js appenders配置
                    {
                        "type": "file",
                        "filename": "track.log",
                        "category": "track",
                        "level": "LOG",
                        "layout": {
                            "type": "messagePassThrough"
                        }
                    }
                ]
            }
        ]
    }

---
使用

初始化

主进程：

    logger.init("master", [option]);
    // [option]为多日志文件配置，如上

工作进程：

    var logger = require('@qnpm/q-logger');
    logger.init('worker', [option]); // 初始化日志系统

接口：

    logger.error(); // 记录错误
    logger.info(); // 记录普通日志

<a name="qexception"></a>
### 异常 @qnpm/q-exception
---
使用

    var exception = require('@qnpm/q-exception');

    exception.init(logger); // 初始化异常捕获系统，需传入logger用作错误记录

    // 捕获异步异常，放到所有中间件前面
    app.use(exception.catchAsync());

    // 捕获同步异常，放到所有中间件后面
    app.use(exception.catchSync());

<a name="qhealthcheck"></a>
### healthcheck @qnpm/q-healthcheck
---
使用

    var healthcheck = require('@qnpm/q-healthcheck');
    // healthcheck 发布时有用
    healthcheck.check(app, path.join(__dirname, 'healthcheck.html')); // 传入healthcheck的路径

<a name="qmonitor"></a>
### 监控 @qnpm/q-monitor
---
使用

    var qmonitor = require('@qnpm/q-monitor');
    qmonitor.addCount('监控指标名');
    qmonitor.addTime('监控指标名', '时间');

<a name="qmultiprocess"></a>
### 多进程 @qnpm/q-multiprocess
---
使用

     var opts = {
      // CPU核数
      numCPUs: require('os').cpus().length,
      // 端口
      port: app.get('port'),
      // 子进程收到父进程消息后父进程执行方法
      workerMessage: function (msg, workers) {

      },
      ready: function(workers) {

      }
    };

    multiprocess.listen(app, opts);
