Bagaimana untuk menyimpan Node.js penyebaran pengaturan/konfigurasi file?
Saya telah bekerja pada beberapa Node apps, dan I've telah mencari pola yang baik menyimpan penyebaran yang berhubungan dengan pengaturan. Di Django dunia (dari mana aku datang), umum berlatih akan memiliki settings.py
file yang berisi pengaturan standar (timezone, dll), dan kemudian local_settings.py
untuk penyebaran pengaturan khusus, yaitu. apa database untuk bicara, apa yang memcache socket, e-mail admin dan sebagainya.
Saya telah mencari pola yang sama untuk Node. Hanya file konfigurasi akan lebih baik, sehingga tidak harus menjadi macet dengan segala sesuatu yang lain dalam app.js
, tetapi saya menemukan hal ini penting untuk memiliki cara untuk memiliki server-konfigurasi tertentu pada file yang tidak di kontrol sumber. Aplikasi yang sama juga bisa digunakan di server yang berbeda dengan liar pengaturan yang berbeda, dan harus berurusan dengan menggabungkan konflik dan semua itu adalah bukan ide yang menyenangkan.
Jadi ada semacam kerangka/alat untuk ini, atau apakah semua orang hanya hack sesuatu bersama-sama mereka?
Saya menggunakan
paket.json
untuk saya paket danconfig.js
untuk konfigurasi saya, yang terlihat seperti:Saya load config dari proyek saya:
dan kemudian saya dapat mengakses hal-hal dari
config.db_host
,config.db_port
, dll... Ini memungkinkan saya menggunakan hardcoded parameter atau parameter yang disimpan dalam variabel lingkungan jika saya don't ingin menyimpan password di kontrol sumber.Aku juga menghasilkan
paket.json
dan masukkan dependensi bagian:Ketika saya clone proyek untuk mesin lokal, saya menjalankan
npm install
untuk menginstal paket. Info lebih lanjut tentang itu di sini.Proyek yang disimpan di GitHub, dengan remote menambahkan untuk server produksi.
Anda dapat meminta file JSON sebagai Node v0.5.x (referensi jawaban ini)
config.json:
app.js:
Banyak kemudian, saya menemukan cukup baik Node.js modul untuk mengelola konfigurasi: nconf.
Contoh sederhana:
Ini juga mendukung menyimpan pengaturan di Redis, tulisan file-file konfigurasi, dan memiliki cukup solid API, dan juga didukung oleh salah satu dari lebih dihormati Node.js toko-toko, Nodejitsu, sebagai bagian dari [Seterika][] kerangka inisiatif, sehingga harus cukup masa depan-bukti.
Check out nconf di Github.
Solusi saya adalah cukup sederhana:
Beban lingkungan config di ./config/index.js
Mendefinisikan beberapa default dalam ./config/config.global.js
Override default dalam ./config/config.test.js
Menggunakannya dalam ./models/user.js:
Menjalankan aplikasi anda di lingkungan tes:
Hal ini dijelaskan secara lebih rinci berikut ini: http://www.chovy.com/node-js/managing-config-variables-inside-a-node-js-application/
Anda mungkin juga melihat ke dotenv yang mengikuti prinsip-prinsip yang dua belas-faktor app.
Aku digunakan untuk menggunakan node-config, tapi dibuat dotenv untuk alasan itu. Itu benar-benar terinspirasi oleh ruby's dotenv perpustakaan.
Penggunaan cukup mudah:
Kemudian anda hanya membuat .env file dan menempatkan pengaturan anda di sana seperti:
Yang's dotenv untuk nodejs.
Apakah kalian menggunakan npm untuk memulai script anda (env dll) ?
Jika anda menggunakan
.env
file, anda dapat memasukkan mereka dalampaket.json
dan menggunakan npm untuk sumber/awal mereka.Contoh:
kemudian jalankan npm script:
Yang dijelaskan di sini https://gist.github.com/ericelliott/4152984 Semua kredit untuk Eric Elliot
Anda mungkin juga melihat ke node-config yang memuat file konfigurasi tergantung pada $HOST dan __$NODE_ENV__ variabel (sedikit seperti RoR) : dokumentasi.
Ini bisa sangat berguna untuk berbagai penyebaran pengaturan (
pembangunan
,test
atauproduksi
).Hanya melakukan yang sederhana
settings.js
denganekspor
:Kemudian, pada script anda, melakukan
memerlukan
:Semua pengaturan anda sekarang akan tersedia melalui
pengaturan
variabel:I'm akan melemparkan topi ke dalam ring sini karena tidak satupun dari jawaban anda, semua komponen-komponen penting yang cukup banyak setiap kebutuhan sistem. Pertimbangan:
Berikut ini's bagaimana saya melakukan konfigurasi:
config.default.private.js
- In kontrol versi, ini adalah konfigurasi default pilihan yang hanya dapat dilihat oleh backend anda.config.default.public.js
- In kontrol versi, ini adalah konfigurasi default pilihan yang dapat dilihat oleh backend dan frontendconfig.dev.private.js
- Jika anda membutuhkan pribadi yang berbeda default untuk dev.config.dev.public.js
- Jika anda membutuhkan publik yang berbeda default untuk dev.config.private.js
- Tidak di kontrol versi, ini adalah lingkungan tertentu pilihan yang menimpaconfig.default.private.js
config.public.js
- Tidak di kontrol versi, ini adalah lingkungan tertentu pilihan yang menimpaconfig.default.public.js
kunci
- folder di mana masing-masing file yang menyimpan berbagai rahasia dari beberapa jenis. Ini juga tidak di bawah kontrol versi (kunci tidak boleh di bawah kontrol versi).Saya menggunakan javascript polos-lama file-file untuk konfigurasi sehingga aku memiliki kekuatan penuh dari javascript langauge (termasuk komentar dan kemampuan untuk melakukan hal-hal seperti load default config di lingkungan-file tertentu sehingga mereka kemudian dapat diganti). Jika anda ingin menggunakan variabel lingkungan, anda dapat memuat mereka dalam mereka config file (tho saya sarankan terhadap menggunakan env var untuk alasan yang sama saya don't sarankan menggunakan json file - anda don't memiliki kekuatan bahasa pemrograman untuk membangun config).
Alasan setiap tombol pada file yang terpisah adalah untuk installer menggunakan. Hal ini memungkinkan anda untuk memiliki installer yang menciptakan tombol on-mesin dan toko-toko mereka di tombol folder. Tanpa ini, installer anda mungkin gagal ketika anda memuat berkas konfigurasi yang dapat't akses kunci anda. Dengan cara ini anda dapat melintasi direktori dan beban tombol apa saja file yang ada di folder itu tanpa harus khawatir tentang apa yang ada dan apa yang doesn't dalam setiap versi dari kode anda.
Karena anda mungkin memiliki tombol dimuat dalam pribadi anda konfigurasi, anda pasti don't ingin memuat pribadi anda config di frontend kode. Sementara yang mungkin benar-benar lebih ideal untuk benar-benar terpisah frontend anda codebase dari backend anda, banyak kali bahwa PITA ini cukup besar penghalang untuk mencegah orang dari melakukan hal itu, sehingga swasta vs publik config. Tapi ada's dua hal yang saya lakukan untuk mencegah swasta config yang dimuat di frontend:
Satu hal terakhir: konfigurasi anda harus dimuat ke browser melalui benar-benar file terpisah dari yang lain frontend kode. Jika anda bundel frontend anda kode, umum konfigurasi yang harus dibangun sebagai benar-benar terpisah bundel. Jika tidak, anda config isn't benar-benar config lagi - hanya bagian dari kode anda. Config kebutuhan untuk dapat berbeda pada mesin yang berbeda.
Tahanan adalah pilihan lain yang menambahkan skema untuk validasi. Seperti nconf, mendukung memuat pengaturan dari setiap kombinasi dari variabel lingkungan, argumen, file, dan objek json.
Contoh dari README:
Memulai artikel: Penjinakan Konfigurasi dengan node-convict
Anda dapat menggunakan Konfig untuk lingkungan tertentu config file. Beban json atau yaml file konfigurasi secara otomatis, memiliki nilai default dan dinamis konfigurasi fitur.
Contoh dari Konfig repo:
Dalam pembangunan:
Dalam produksi, misalnya kita mulai dengan aplikasi
$ NODE_ENV=produksi PORT=4567 node app.js
Rincian lebih lanjut : https://github.com/vngrs/konfig
Saya akan membuat sebuah folder config file penamaan sebagai
config.js
dan kemudian saya akan menggunakan file ini di mana pun diperlukan sebagai berikutContoh config.js
Kemudian jika saya ingin menggunakan file konfigurasi ini di suatu tempat
Pertama saya akan impor seperti di bawah ini
var config = require('./config');
dan saya dapat mengakses nilai-nilai seperti di bawah ini
Hanya menggunakan
npm
modulconfig
(lebih dari 300000 download)https://www.npmjs.com/package/config
Node-config menyelenggarakan hirarkis konfigurasi untuk aplikasi anda penyebaran.
Hal ini memungkinkan anda menentukan satu set default parameter, dan memperpanjang mereka untuk berbagai penyebaran lingkungan (pengembangan, qa, pementasan, produksi, dll.).
It's baik untuk memisahkan 'pengembangan' dan 'produksi' konfigurasi.
Saya menggunakan cara berikut: Di sini saya config/index.js file:
Untuk memerlukan konfigurasi menggunakan berikut:
Daripada anda dapat menggunakan konfigurasi objek:
Saya sedikit terlambat dalam permainan, tapi aku tidak't menemukan apa yang saya butuhkan di sini - atau di mana pun - jadi saya menulis sesuatu sendiri.
Kebutuhan saya untuk konfigurasi mekanisme adalah sebagai berikut:
settings-overrides.js
- yang terlihat sama tetapi memungkinkan menimpa konfigurasi disettings.js
. Idenya di sini adalah untuk mengubah konfigurasi dengan mudah tanpa mengubah kode. Saya menemukan itu berguna untuk saas.Meskipun saya peduli tentang lingkungan yang mendukung - yang akan menjelaskan bagaimana untuk menambah mudah untuk solusi saya
Penjelasan
undefined
berarti properti ini diperlukannull
berarti itu adalah opsionalmeConf
- saat ini kode adalah target untuk file di bawahaplikasi
.meConf
adalah menimpa file yang ditargetkan untukconf/dev
- yang diabaikan oleh saya vcs.publicConfiguration
- akan terlihat dari front-end dan back-end.privateConfiguration
- akan terlihat dari back-end saja.sendPublicConfiguration
- rute yang akan mengekspos semua konfigurasi dan menetapkan variabel global. Untuk contoh kode di bawah ini akan mengekspos semua konfigurasi sebagai variabel global myConf di front-end. Secara default akan menggunakan variabel global namaconf
.aplikasi.mendapatkan("/backend/conf", memerlukan("conf").sendPublicConfiguration);
<script src="/backend/conf?nama=myConf" type="javascript/teks">Logika menimpa
Menambahkan dukungan lingkungan
Meskipun aku don't menemukan "lingkungan mendukung" berguna, mungkin seseorang akan.
Untuk menambah lingkungan dukungan yang anda butuhkan untuk mengubah meConf memerlukan pernyataan untuk sesuatu seperti ini (pseudocode)
jika ( lingkungan == "produksi" ) { meConf = require("../conf/dev/meConf").produksi; }
jika ( lingkungan == "pengembangan" ) { meConf = require("../conf/dev/meConf").pembangunan; }
Demikian pula anda dapat memiliki sebuah file per lingkungan
dan impor yang tepat. Sisa logika tetap sama.
alt contoh yang saya hanya digunakan karena aku ingin lebih banyak fleksibilitas daripada yang khas .file json tetapi didn't ingin disarikan pergi ke perpustakaan yang akan membutuhkan ketergantungan adalah sesuatu seperti ini. Pada dasarnya, mengekspor fungsi yang dipanggil segera yang kembali sebuah objek dengan nilai-nilai yang saya inginkan mengatur. Memberikan banyak fleksibilitas.
Ada banyak penjelasan yang lebih baik dengan penuh contoh berikut. Menggunakan Config File di Node.js
Saya tahu ini adalah benar-benar old post. Tapi saya ingin berbagi modul untuk mengkonfigurasi variabel lingkungan, saya pikir itu adalah solusi yang fleksibel. Berikut ini adalah modul json-configurator
Kemudian anda dapat menggunakan
proses.env.NODE_ENV
untuk mendapatkan semua variabel untuk lingkungan anda.Selain nconf modul disebutkan dalam jawaban, dan node-config disebutkan di jawaban ini, ada juga node-iniparser dan IniReader, yang muncul untuk menjadi lebih sederhana .ini file konfigurasi parsers.
Saya baru-baru ini merilis sebuah modul kecil untuk memuat semua jenis file-file konfigurasi. It's cukup lurus ke depan, anda dapat memeriksa di https://github.com/flesler/config-node
Anda dapat menggunakan pconf: https://www.npmjs.com/package/pconf
Contoh: