Eu tenho trabalhado em algumas aplicações de Node, e I'tenho procurado por um bom padrão de armazenamento de configurações relacionadas à implantação. No mundo Django (de onde eu venho), a prática comum seria ter um arquivo settings.py
contendo as configurações padrão (timezone, etc), e então um local_settings.py
para configurações específicas de deployment, ou seja, qual banco de dados falar, qual soquete memcache, endereço de e-mail para os administradores e assim por diante.
Tenho procurado por padrões semelhantes para o Node. Apenas um arquivo de configuração seria bom, então ele não precisa estar preso com tudo o resto no `app.js', mas eu acho importante ter uma maneira de ter uma configuração específica do servidor em um arquivo que não está no controle de código fonte. O mesmo aplicativo poderia muito bem ser implementado em servidores diferentes com configurações muito diferentes, e ter que lidar com conflitos de fusão e tudo isso não é minha idéia de diversão.
Então, existe algum tipo de estrutura/ferramenta para isto, ou toda a gente hackeia alguma coisa sozinha?
Eu utilizo um package.json
para meus pacotes e um config.js
para minha configuração, que se parece com:
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;
Eu carrego a configuração do meu projeto:
var config = require('./config');
e depois posso aceder às minhas coisas a partir de config.db_host
, config.db_port
, etc... Isso me permite ou usar parâmetros codificados, ou parâmetros armazenados em variáveis ambientais se eu não'não quero armazenar senhas no controle de código fonte.
Também gerei um package.json
e inseri uma seção de dependências:
"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"
}
Quando eu clono o projeto na minha máquina local, eu corro `npm install' para instalar os pacotes. Mais informações sobre isso aqui.
O projeto é armazenado no GitHub, com controles remotos adicionados para o meu servidor de produção.
Muito mais tarde, eu encontrei um módulo Node.js muito bom para gerenciar a configuração: nconf.
Um exemplo simples:
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'));
Ele também suporta armazenamento de configurações em Redis, escrita de arquivos de configuração, e tem uma API razoavelmente sólida, e também é apoiado por uma das mais respeitadas lojas Node.js, Nodejitsu, como parte da iniciativa [Flatiron][] framework, portanto, deve ser razoavelmente à prova de futuro.
Confira nconf em Github.
Você também pode olhar para node-config que carrega o arquivo de configuração dependendo da variável $HOST e __$NODE_ENV__ (um pouco como RoR) : documentação.
Isto pode ser bastante útil para diferentes configurações de implantação (desenvolvimento
, teste
ou produção
).