Pracoval som na niekoľkých aplikáciách Node a hľadal som dobrý vzor na ukladanie nastavení súvisiacich s nasadením. Vo svete Django (odkiaľ pochádzam) je bežnou praxou mať súbor settings.py
, ktorý obsahuje štandardné nastavenia (časová zóna atď.), a potom súbor local_settings.py
pre špecifické nastavenia nasadenia, t. j. s akou databázou sa má komunikovať, aký soket memcache, e-mailovú adresu pre administrátorov atď.
Podobné vzory som hľadal aj pre Node. Len konfiguračný súbor by bol fajn, aby sa nemusel zasekávať medzi všetko ostatné v app.js
, ale považujem za dôležité mať možnosť mať konfiguráciu špecifickú pre server v súbore, ktorý nie je v správe zdrojov. Tá istá aplikácia by mohla byť nasadená na rôznych serveroch s divoko odlišnými nastaveniami a riešiť konflikty pri zlučovaní a podobne nie je moja predstava zábavy.
Existuje na to nejaký framework/nástroj, alebo si každý niečo poskladá sám?
Pre svoje balíky používam súbor package.json
a pre konfiguráciu súbor config.js
, ktorý vyzerá takto:
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;
Načítam konfiguráciu z môjho projektu:
var config = require('./config');
a potom môžem pristupovať k mojim veciam z config.db_host
, config.db_port
, atď... To mi umožňuje používať buď natvrdo zadané parametre, alebo parametre uložené v premenných prostredia, ak nechcem ukladať heslá v správe zdrojov.
Taktiež generujem súbor package.json
a vkladám do neho sekciu závislostí:
"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"
}
Keď naklonujem projekt na svoj lokálny počítač, spustím npm install
na inštaláciu balíkov. Viac informácií o tom tu.
Projekt je uložený na GitHub, pričom pre môj produkčný server sú pridané vzdialené položky.
Oveľa neskôr som našiel celkom dobrý modul Node.js na správu konfigurácie: nconf.
Jednoduchý príklad:
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'));
Podporuje tiež ukladanie nastavení v Redis, zápis konfiguračných súborov, má pomerne solídne API a je tiež podporovaný jedným z rešpektovanejších Node.js obchodov, Nodejitsu, ako súčasť iniciatívy Flatiron framework, takže by mal byť pomerne odolný voči budúcnosti.
Pozrite si nconf na Githube.
Môžete sa tiež pozrieť na node-config, ktorý načíta konfiguračný súbor v závislosti od premennej $HOST a __$NODE_ENV__ (trochu ako RoR) : documentation.
To môže byť celkom užitočné pre rôzne nastavenia nasadenia (development
, test
alebo production
).