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微信公众号
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种环境配置对应的值
很赞,我也为这个烦恼过,防止每次修改,哈哈哈
共收到8条回复