w3ctech

为thinkjs添加环境配置

thinkjs自身是支持2套配置,一个是默认的config.js配置,一个是调试时才加载的debug.js,但在真实使用中发现这2个配置“满足不了我”,比如我代码是开源放在github上的,我不可能把数据库密码啥也放上吧。。。于是我就得在主机上git pull源码后再修改重要的信息,时间长了更新的时候我就有点烦了,一直得改来改去。于是想加一个配置文件。

大概的思路是启动程序时根据配置文件来判断当前的hostname是否有相关的文件,如果有,则读取这个文件并覆盖到config.js上,这样就可以上班电脑是一套(读本地的库),家里电脑是一套(读vps的库),本是一套(读vps的库),服务器上是一套(读自身的库),然后可以把相关的重要文件添加到git忽略文件,最终达到上线无压力的目的。

建立App/Conf/environment.js文件,内容为:

/**
 * 环境配置
 * @description 根据environment.json里配置的hostname来加载不同的配置文件,并覆盖传来的参数,注意加载的配置文件是基于当前路径下的
 * @author xieliang
 * @path App/Conf/environment.js
 */


'use strict';

var hostname = require('os').hostname();
var data = require('./environment.json');


module.exports = function(config) {
    var fileName, file;

    //遍历所有的配置环境数据
    data.forEach(function(val) {

        if (!Array.isArray(val.name)) {
            val.name = [val.name];
        }

        if (val.name.indexOf(hostname) > -1) {
            fileName = val.config;
        }
    });

    if (fileName) {
        try {
            file = require('./' + fileName);
            Object.keys(file).forEach(function(val) {
                config[val] = file[val];
            });
        } catch (e) {}
    }

    return config;
}

建立App/Conf/environment.json文件,内容为:

[
    {
        "name": "xxoo-for-mm",
        "config": "xx"
    },
    {
        "name": ["ceshiji", "work"],
        "config": "xxx"
    },
    {
        "name": "online",
        "config": "online"
    }
]

json配置文件内容是一个数组,只要对象的name为当前主机的hostname则算匹配成功,支持数组方式

修改App/Conf/config.js内容:

'use strict';

var config = {
    ...
};

module.exports = require('./environment')(config);

注意:这种方式后请删除App/Conf/debug.js文件,因为全走这种方式,即使你开启APP_DEBUG也不让程序加载debug.js

其实就是程序只加载config.js,然后config.js里调用环境配置,并覆盖下加载程序。。。

最后感谢@旭的帮助,感谢@thinkjs

转自http://www.xuexb.com/html/thinkjsconfig.html

w3ctech微信

扫码关注w3ctech微信公众号

共收到8条回复

  • good,又出新文啦

    回复此楼
  • @裕波 _ 前段时间比较忙,以后常逛~

    回复此楼
  • @xuexb 热烈欢迎呀!

    回复此楼
  • 赞。但不推荐使用hostname来识别,机器名一般都不是一样的,多机部署的时候会有问题。

    个人项目可以考虑这么使用。

    回复此楼
  • @老六 其实我想的比较简单吧,比如:

    //多个测试机用一个配置
    {
        "name": ["dev-name1", "dev-name2", "dev-name3"],
        "config": "dev"
    },
    
    //多个线上用一个
    {
        "name": ["online-name1", "online-name2", "online-name3"],
        "config": "online"
    },
    

    当然只是解决目前我的需求~嘎嘎

    回复此楼
  • 嗯,能思考、自己找方案,很赞了!

    回复此楼
  • @前端小武 2.0里添加了env配置,可以对development, testing, production等3种环境配置对应的值

    回复此楼
  • 很赞,我也为这个烦恼过,防止每次修改,哈哈哈

    回复此楼