Cum pentru a stoca Node.js desfășurarea setări/configurare fișiere?
Am fost de lucru pe câteva Nod aplicații, și am'am fost în căutarea pentru un bun model de stocare de implementare legate de setări. În Django lume (de unde vin eu), comune în practică ar fi să avem un settings.py` fișier care conține setările standard (fus orar, etc), și apoi o local_settings.py pentru desfășurarea setări specifice, de exemplu. ce bază de date care să vorbești, ce memcache soclu, adresa de e-mail pentru administratori și așa mai departe.
Am fost în căutarea pentru modele similare pentru Nod. Doar un fișier de configurare ar fi frumos, așa că nu trebuie să fie blocată în cu totul altceva în app.js`, dar mi se pare important de a avea o modalitate de a avea specifice serverului de configurare într-un fișier care nu este în control sursă. Aceeași aplicație ar putea fi implementat pe diferite servere cu diferite salbatic setări, și având de a face cu îmbinare conflicte și cu toate că nu este ideea mea de distracție.
Deci, există un fel de cadru/instrument pentru acest lucru, sau nu doar toată lumea hack ceva împreună ei înșiși?
Eu folosesc un pachet.json pentru pachete și o config.js pentru configuratia mea, care arata ca:
Am încărca config din proiectul meu:
și atunci pot să am acces la lucruri din
config.db_host
,config.db_port
, etc... Asta îmi permite să fie utilizați hardcoded parametri, sau parametrii stocate în variabile de mediu, dacă nu't vreau pentru a stoca parolele într-sursă control.Am, de asemenea, de a genera un pachet.json și introduce o dependențe secțiune:
Când am clona proiectul meu locale mașină, conduc
npm install
pentru a instala pachetele. Mai multe informatii pe care aici.Proiectul este stocat în GitHub, cu telecomenzi adăugat pentru server de producție.
Puteți solicita fișiere JSON fel de Nod v0.5.x (referire la acest raspuns)
config.json:
app.js:
Mult mai târziu, am găsit-o destul de bine Node.js modulul de management de configurare: nconf.
Un exemplu simplu:
Acesta susține, de asemenea, stocarea setările din Redis, scriere fișiere de configurare, și are o destul de solid API, și este, de asemenea, susținută de una dintre cele mai bine-respectat Node.js magazine, Nodejitsu, ca parte a Fier de călcat cadru de inițiativă, așa că ar trebui să fie destul de viitor.
Check out nconf la Github.
Soluția mea este destul de simplă:
Încărcați mediu config în ./config/index.js
Definirea unor valori implicite în ./config/config.global.js
Suprascrie setările implicite în ./config/config.test.js
Folosind-o în ./models/user.js:
Rulează aplicația în mediul de testare:
Acest lucru este explicat în detaliu aici: http://www.chovy.com/node-js/managing-config-variables-inside-a-node-js-application/
S-ar putea uita, de asemenea, la dotenv care urmează principiile unei doisprezece-factor app.
Am folosit pentru a utiliza node-config, dar a creat dotenv pentru acest motiv. Acesta a fost complet inspirat de ruby's dotenv bibliotecă.
Utilizarea este destul de simplu:
Apoi, trebuie doar să creați un .env fișier și pune-ți setările de acolo astfel:
Ca's dotenv pentru nodejs.
Sunteți folosind npm pentru a începe dvs. de script-uri (env etc) ?
Dacă utilizați
.env fișierele puteți să le includă în pachet.json
și de a folosi npm la sursă/start-le.Exemplu:
apoi executați npm scripturi:
Sale descrise aici https://gist.github.com/ericelliott/4152984 Toate de credit pentru Eric Elliot
S-ar putea uita, de asemenea, la node-config care încarcă fișierul de configurare în funcție de $GĂZDUI și __$NODUL_MEDIU__ variabilă (un pic ca RoR) : documentație.
Acest lucru poate fi destul de util pentru diferite implementare setări ("dezvoltarea", "test" sau "producție").
Nu doar un simplu `settings.js cu "exporturi":
Apoi, în script-ul dvs., face o
nevoie
:Toate setările acum va fi la dispoziție, prin intermediul "setări" variabilă:
Am'm de gând să arunce pălăria în ring aici pentru că nici unul dintre aceste răspunsuri adresa toate componentele critice care destul de mult orice sistem are nevoie. Considerente:
Aici's cum fac configuratia mea:
config.default.private.js
- În versiunea de control, acestea sunt implicit opțiuni de configurare care poate fi văzută numai de dvs. backend.config.default.public.js
- În versiunea de control, acestea sunt implicit opțiuni de configurare care pot fi văzute de backend și frontendconfig.private.js
- Nu în versiunea de control, acestea sunt mediul opțiuni specifice care pot suprascrieconfig.default.private.js
config.public.js
- Nu în versiunea de control, acestea sunt mediul opțiuni specifice care pot suprascrieconfig.default.public.js
Eu folosesc simplu-vechi javascript fișiere de configurare, așa că am avea puterea deplină de javascript langauge (inclusiv comentarii și capacitatea de a face lucruri cum ar fi load default config în mediul de fișier specifice astfel încât acestea pot fi apoi înlocuite). Dacă doriți să utilizați variabile de mediu, puteți să încărcați-le în interiorul acestor fișiere de configurare (tho recomand utilizarea env var pentru același motiv pentru care nu't recomandăm să utilizați fișiere json - nu't au puterea de un limbaj de programare pentru a construi dvs. de configurare).
Motivul pentru fiecare cheie este într-un fișier separat pentru instalare utilizare. Acest lucru vă permite să aveți un program de instalare, care creează cheile de la mașină și le stochează în cheile folder. Fără acest lucru, installer ar putea eșua atunci când încărcați fișier de configurare care poate't de acces cheile. În acest fel puteți traversa director și încărca orice fișiere cheie care sunt în acel dosar, fără a fi nevoie să vă faceți griji despre ceea ce există și ceea ce nu't în orice versiune de cod.
Din moment ce, probabil au cheile încărcate în privat de configurare, te siguranță nu't doriți să încărcați privat config în orice frontend cod. În timp ce, probabil, strict mai ideal pentru a separa complet frontend codebase din backend dvs., de multe ori, asta PITA este o destul de mare bariera pentru a preveni oamenii de la a face, astfel, privat vs public config. Dar nu's două lucruri pe care le fac pentru a preveni privat config fi încărcate în interfața:
Un ultim lucru: configuratia ta ar trebui să fie încărcate în browser-ul prin intermediul unui complet fișier separat decât orice alte frontend cod. Daca ai pachet de interfață cod, publicul de configurare ar trebui să fie construit ca un pachet complet separate. În caz contrar, config e't într-adevăr config mai - doar o parte din cod. Config trebuie să fie capabil de a fi diferit pe diferite masini.
Condamna este o altă opțiune care adaugă o schema pentru validare. Ca nconf, se sprijină de încărcare setări din orice combinație de variabile de mediu, argumente, fișiere și obiecte json.
Exemplu din README:
Noțiuni de bază articolul: Îmblânzirea Configurații cu node-convict
Puteți utiliza Konfig pentru mediu specifice fișiere de configurare. Se încarcă json sau yaml config fișiere în mod automat, acesta are implicit valoarea și configurare dinamică caracteristici.
Un exemplu de Konfig repo:
În dezvoltare:
În producție, presupune să începem aplicarea cu
$ NODE_ENV=producția PORT=4567 nod app.js
Mai multe detalii : https://github.com/vngrs/konfig
Voi crea un folder config ca o denumire fișier ca `config.js și mai târziu, voi folosi acest fișier oriunde este necesar ca mai jos
Exemplu de config.js
Apoi, dacă vreau să folosesc acest config undeva
Voi primul import de mai jos
var config = necesită('./config');
și nu am acces la valorile de mai jos
Doar folosi npm
module
config` (mai mult de 300.000 de descărcări)https://www.npmjs.com/package/config
Node-config organizează ierarhic configurații pentru aplicația dvs. implementări.
Acesta vă permite să definiți un set de parametri implicite, și le extinde pentru diferite implementare medii (de dezvoltare, de asigurare a calității, de intermediere, de producție, etc.).
L's mai bine să se separe 'dezvoltarea' și 'producție' configs.
Eu folosesc după cum urmează: Aici este meu config/index.js file:
Pentru necesită configurare, utilizați următoarele opțiuni:
Decât vă puteți folosi config obiect:
Eu sunt un pic mai târziu în joc, dar nu puteam't găsi ceea ce am nevoie aici - sau oriunde altundeva - așa că am scris ceva.
Cerințele mele pentru un mecanism de configurare sunt următoarele:
settings-overrides.js
- care arată la fel, dar vă permite de relevare a informațiilor de configurare de la settings.js`. Ideea aici este de a modifica configurația cu ușurință, fără a schimba codul. Mi se pare util pentru saas.Chiar dacă îmi pasă mai puțin despre susținerea medii - va explica cum să adăugați cu ușurință la soluția mea
Explicație
null
înseamnă că este optionalmeConf
- în prezent, codul este ținta într-un fișier sub "app".meConf
este suprascrie fișierele care se adreseazaconf/dev
- care este ignorat de catre mea vcs.publicConfiguration
- va fi vizibil de la front-end și back-end.privateConfiguration
- va fi vizibil din back-end numai.sendPublicConfiguration
- un traseu care va expune public de configurare și atribuiți-l la o variabilă globală. De exemplu, codul de mai jos va expune public de configurare ca variabilă globală myConf în front-end. În mod implicit se va folosi variabila globală numeleconf
.app.ia("/backend/conf", avea nevoie("conf").sendPublicConfiguration);
<script src="/backend/conf?name=myConf" type="javascript/text">Logica suprascrie
Adăugând mediu de sprijin
Chiar dacă eu nu't găsi un "mediu" util, poate cineva o va face.
Pentru a adăuga mediului sprijinul de care aveți nevoie pentru a schimba meConf nevoie de declarație la ceva de genul asta (pseudocod)
dacă ( mediu == "producție" ) { meConf = necesită("../conf/dev/meConf").de producție; }
dacă ( mediu == "dezvoltare" ) { meConf = necesită("../conf/dev/meConf").de dezvoltare; }
În mod similar, puteți avea un fișier per mediu
și de import de cea dreapta. Restul de logica rămâne aceeași.
un alt exemplu am folosit pentru că am vrut mai multă flexibilitate decât un tipic .fișier json dar nu't vreau captate într-o bibliotecă care ar necesita o dependență este ceva de genul asta. Practic, exportul de o funcție invocat imediat care a returnat un obiect cu valori am vrut stabilit. Oferă o mulțime de flexibilitate.
Există o mult mai bună explicație cu deplină exemplu aici. Folosind Fișiere de Configurare în Node.js
Știu că acest lucru este un foarte vechi post. Dar vreau să-mi împărtășesc modul pentru configurarea variabilelor de mediu, cred că este foarte flexibilă soluție. Aici este modul json-configurator
Apoi, puteți utiliza
proces.env.NODE_ENV
pentru a obține toate variabilele pentru mediul dumneavoastră.În plus față de nconf modul menționat în acest răspuns, node-config menționat în acest răspuns, există, de asemenea, nod-iniparser și IniReader, care par a fi mai simple .ini fișier de configurare interpretoare.
Recent am lansat un modul mic de a încărca orice tip de fișiere de configurare. L's destul de straight-forward, puteți verifica la https://github.com/flesler/config-node
Puteți utiliza pconf: https://www.npmjs.com/package/pconf
Exemplu: