我一直在开发一些Node应用程序,我一直在寻找一种良好的模式来存储与部署有关的设置。在Django世界(我来自那里),通常的做法是有一个settings.py
文件,包含标准设置(时区等),然后有一个local_settings.py
用于部署特定的设置,即与什么数据库对话,什么memcache套接字,管理员的电子邮件地址等。
我一直在为Node寻找类似的模式。只要有一个配置文件就好了,这样它就不必和app.js
中的其他东西混在一起,但我发现有一种方法可以在一个不在源码控制中的文件中进行服务器特定的配置,这一点很重要。同一个应用很可能被部署在不同的服务器上,设置也大不相同,要处理合并冲突和所有这些都不是我想要的。
那么,是否有某种框架/工具来解决这个问题,还是每个人都只是自己黑在一起?
我使用package.json
来存放我的软件包,使用config.js
来存放我的配置,看起来像。
var config = {};
config.twitter = {};
config.redis = {};
config.web = {};
config.default_stuff = ['red','green','blue','apple','yellow','orange','politics'];
config.twitter.user_name = process.env.TWITTER_USER || 'username';
config.twitter.password= process.env.TWITTER_PASSWORD || 'password';
config.redis.uri = process.env.DUOSTACK_DB_REDIS;
config.redis.host = 'hostname';
config.redis.port = 6379;
config.web.port = process.env.WEB_PORT || 9980;
module.exports = config;
我从我的项目中加载配置。
var config = require('./config');
然后我可以通过config.db_host
、config.db_port
等访问我的东西。 这让我可以使用硬编码的参数,或者如果我不想在源码控制中存储密码,可以使用存储在环境变量中的参数。
我还生成了一个package.json
并插入了一个依赖部分。
"dependencies": {
"cradle": "0.5.5",
"jade": "0.10.4",
"redis": "0.5.11",
"socket.io": "0.6.16",
"twitter-node": "0.0.2",
"express": "2.2.0"
}
当我把项目克隆到我的本地机器时,我运行npm install
来安装这些包。更多信息这里。
该项目存储在GitHub中,并为我的生产服务器添加了远程。
很久以后,我发现了一个相当好的Node.js模块来管理配置。[nconf][]。
一个简单的例子。
var nconf = require('nconf');
// First consider commandline arguments and environment variables, respectively.
nconf.argv().env();
// Then load configuration from a designated file.
nconf.file({ file: 'config.json' });
// Provide default values for settings not provided above.
nconf.defaults({
'http': {
'port': 1337
}
});
// Once this is in place, you can just use nconf.get to get your settings.
// So this would configure `myApp` to listen on port 1337 if the port
// has not been overridden by any of the three configuration inputs
// mentioned above.
myApp.listen(nconf.get('http:port'));
它还支持在Redis中存储设置,编写配置文件,并拥有相当扎实的API,而且还得到了较受尊敬的Node.js商店之一Nodejitsu的支持,作为Flatiron框架计划的一部分,所以它应该是相当具有未来性的。
在Github上查看[nconf][nconf]。