node.js - 如何存储Node.js部署设置/ 配置文件?

  显示原文与译文双语对照的内容

我一直在做一些节点应用,我一直在寻找存储deployment-related设置的好模式。 在django( 我来自哪里) 世界,共同练习会有( 时区等) settings.py 文件包含标准设置,然后 local_settings.py 部署特定设置, IE 。 要与哪个数据库交谈,什么是memcache套接字,管理员的E-mail 地址等等。

我一直在寻找类似的节点模式。 只是一个配置文件会很好,所以它不需要在 app.js 中被阻塞,但是我发现在一个不在源代码管理中的文件中有server-specific配置很重要。 同样的应用可以通过不同的服务器部署到不同的服务器上,并且必须处理合并冲突,而这并不是我的想法。

所以有某种框架/工具可以用于这个,或者每个人都在一起?

时间:

稍后,我发现了一个非常好的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 上面.
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 上面.
myApp.listen(nconf.get('http:port'));

它还支持存储设置复述,编写配置文件,和一个相当坚实的api,也由一个 well-respected node.js 商店, Nodejitsu,作为熨斗框架计划,所以它应该相当 future-proof 。

查看 nconf的。

你可以要求JSON文件作为节点 v0.5. x ( 引用这个答案 )

config.json:


{
"username" :"root",
"password" :"foot"
}

app.js:


var config = require('./config.json');
log_in(config.username, config.password);

你可能还希望 node-config加载的配置文件根据 $HOST$NODE_ENV 变量( 有点像 RoR ): 文档

这对于不同的部署设置( developmenttest 或者 production ) 非常有用。

只需做一个简单的settings.js,使用 exports:


exports.my_password = 'value'

然后,在脚本中执行 require:


var settings = require('./settings.js');

你的所有设置现在都可以通过 settings 变量进行配置:


settings.my_password//'value'

你可以将 Konfig 用于环境特定的配置文件。 它自动加载json或者yaml配置文件,它有默认值和动态配置功能。

来自Konfig仓库的一个示例:


File: config/app.json
----------------------------
{
"default": {
"port": 3000,
"cache_assets": true,
"secret_key":"7EHDWHD9W9UW9FBFB949394BWYFG8WE78F"
 },

"development": {
"cache_assets": false
 },

"test": {
"port": 3001
 },

"staging": {
"port": #{process.env.PORT},
"secret_key":"3F8RRJR30UHERGUH8UERHGIUERHG3987GH8"
 },

"production": {
"port": #{process.env.PORT},
"secret_key":"3F8RRJR30UHERGUH8UERHGIUERHG3987GH8"
 }
}

开发中:


> config.app.port
3000

在生产中,假设我们使用 $ NODE_ENV=production PORT=4567 node app.js


> config.app.port
4567

更多细节:https://github.com/vngrs/konfig

是否使用npm启动脚本( 环境等)?

如果你使用env文件,你可以在 package.jason 中包含它们,并使用npm来对源/启动它们

例如


{
"name":"server",
"version":"0.0.1",
"private": true,
"scripts": {
"start":"node test.js",
"start-dev":"source dev.env; node test.js",
"start-prod":"source prod.env; node test.js"
 },
"dependencies": {
"mysql":"*"
 }
}

npm start-dev

这里描述的https://gist.github.com/dilvie/4152984 所有的信用给 Eric Elliot

你也可以查看 dotenv,它遵循 twelve-factor应用程序的原则。

我曾经使用过 node-config,但出于这个原因创建了 dotenv 。 它完全由dotenv的ruby 库所启发。

用法非常简单:


var dotenv = require('dotenv');
dotenv.load();

然后,你只需创建一个. env 文件,然后将设置放入其中:


S3_BUCKET=YOURS3BUCKET
SECRET_KEY=YOURSECRETKEYGOESHERE
OTHER_SECRET_STUFF=my_cats_middle_name

这是 dotenv nodejs 。

罪犯是另一个为验证添加架构的选项。 nconf一样,它支持从 环境变量,参数,文件和json对象的任意组合加载设置。

自述文件中的示例:


var convict = require('convict');
var conf = convict({
 env: {
 doc:"The applicaton environment.",
 format: ["production","development","test"],
 default:"development",
 env:"NODE_ENV"
 },
 ip: {
 doc:"The IP address to bind.",
 format:"ipaddress",
 default:"127.0.0.1",
 env:"IP_ADDRESS",
 },
 port: {
 doc:"The port to bind.",
 format:"port",
 default: 0,
 env:"PORT"
 }
});

入门文章:驯服带有 node-convict的配置

...