J'ai travaillé sur quelques applications Node, et j'ai cherché un bon modèle pour stocker les paramètres liés au déploiement. Dans le monde de Django (d'où je viens), la pratique courante serait d'avoir un fichier settings.py
contenant les paramètres standards (fuseau horaire, etc), et ensuite un local_settings.py
pour les paramètres spécifiques au déploiement, c'est-à-dire quelle base de données utiliser, quel socket memcache, l'adresse e-mail pour les admins et ainsi de suite.
J'ai cherché des modèles similaires pour Node. Juste un fichier de configuration serait bien, ainsi il n'a pas besoin d'être coincé avec tout le reste dans app.js
, mais je trouve important d'avoir un moyen d'avoir une configuration spécifique au serveur dans un fichier qui n'est pas dans le contrôle de source. La même application pourrait très bien être déployée sur différents serveurs avec des paramètres très différents, et avoir à gérer des conflits de fusion et tout ça n'est pas mon idée du plaisir.
Existe-t-il une sorte de cadre/outil pour cela, ou tout le monde se contente-t-il de bricoler quelque chose lui-même ?
J'utilise un package.json
pour mes paquets et un config.js
pour ma configuration, qui ressemble à ceci :
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;
Je charge la configuration depuis mon projet :
var config = require('./config');
et ensuite je peux accéder à mes choses depuis config.db_host
, config.db_port
, etc... Cela me permet d'utiliser soit des paramètres codés en dur, soit des paramètres stockés dans des variables d'environnement si je ne veux pas stocker les mots de passe dans le contrôle de source.
Je génère également un package.json
et insère une section dépendances :
"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"
}
Lorsque je clone le projet sur ma machine locale, je lance npm install
pour installer les paquets. Plus d'informations à ce sujet [ici] (http://howtonode.org/introduction-to-npm).
Le projet est stocké dans GitHub, avec des remotes ajoutés pour mon serveur de production.
Beaucoup plus tard, j'ai trouvé un module Node.js assez bon pour gérer la configuration : [nconf][].
Un exemple simple :
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'));
Il prend également en charge le stockage des paramètres dans [Redis][], l'écriture de fichiers de configuration, et dispose d'une API assez solide. Il est également soutenu par l'un des ateliers Node.js les plus respectés, [Nodejitsu][], dans le cadre de l'initiative du framework [Flatiron][], il devrait donc être à l'épreuve du temps.
Consultez [nconf sur Github][nconf].
[nconf] : https://github.com/flatiron/nconf [Redis] : http://redis.io/ [Nodejitsu] : http://nodejitsu.com/ [Flatiron] : http://flatironjs.org/
Vous pouvez également consulter node-config qui charge le fichier de configuration en fonction des variables $HOST et __$NODE_ENV__ (un peu comme RoR) : documentation.
Cela peut être très utile pour différents paramètres de déploiement (development
, test
ou production
).