Πώς να αποθηκεύσετε τις ρυθμίσεις/αρχεία ρυθμίσεων ανάπτυξης του Node.js;

Έχω εργαστεί σε μερικές εφαρμογές 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;

Φορτώνω το 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, με απομακρυσμένες προσθήκες για τον διακομιστή παραγωγής μου.

Σχόλια (18)
Λύση

Πολύ αργότερα, βρήκα μια αρκετά καλή ενότητα 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, οπότε θα πρέπει να είναι αρκετά ανθεκτικό στο μέλλον.

Δείτε το nconf στο Github.

Σχόλια (15)

Μπορείτε επίσης να κοιτάξετε το node-config το οποίο φορτώνει το αρχείο ρυθμίσεων ανάλογα με τις μεταβλητές $HOST και __$NODE_ENV__ (λίγο σαν το RoR) : documentation.

Αυτό μπορεί να είναι αρκετά χρήσιμο για διαφορετικές ρυθμίσεις ανάπτυξης (development, test ή production).

Σχόλια (0)