Как хранить настройки/конфигурационные файлы развертывания Node.js?
Я работаю над несколькими приложениями Node, и я искал хороший шаблон для хранения настроек, связанных с развертыванием. В мире Django (откуда я родом) общепринятой практикой было бы иметь файл settings.py
, содержащий стандартные настройки (часовой пояс и т.д.), а затем файл local_settings.py
для специфических настроек развертывания, т.е. к какой базе данных обращаться, какой сокет memcache, адрес электронной почты для администраторов и так далее.
Я искал похожие шаблоны для Node. Просто файл конфигурации был бы хорош, так что его не нужно вставлять в app.js
вместе со всем остальным, но я считаю важным иметь возможность конфигурировать специфичные для сервера настройки в файле, который не находится в контроле исходного кода. Одно и то же приложение вполне может быть развернуто на разных серверах с дико разными настройками, и необходимость разбираться с конфликтами слияния и всем прочим - это не мое представление о веселье.
Так есть ли какой-то фреймворк/инструмент для этого, или каждый просто собирает что-то сам?
Я использую
package.json
для своих пакетов иconfig.js
для своей конфигурации, которая выглядит следующим образом:Я загружаю конфигурацию из моего проекта:
и затем я могу получить доступ к моим вещам из
config.db_host
,config.db_port
и т.д... Это позволяет мне использовать либо жестко закодированные параметры, либо параметры, хранящиеся в переменных окружения, если я не хочу хранить пароли в контроле исходников.Я также генерирую
package.json
и вставляю секцию зависимостей:Когда я клонирую проект на локальную машину, я запускаю
npm install
для установки пакетов. Больше информации об этом [здесь] (http://howtonode.org/introduction-to-npm).Проект хранится на GitHub, а для моего рабочего сервера добавлены пульты.
Вы можете требовать файлов JSON в качестве узла в v0.5.х (ссылки этот ответ)
конфиг.в JSON:
app.js:
Гораздо позже я нашел довольно хороший модуль Node.js для управления конфигурацией: nconf.
Простой пример:
Он также поддерживает хранение настроек в Redis, запись конфигурационных файлов и имеет довольно солидный API, а также поддерживается одним из наиболее уважаемых магазинов Node.js, Nodejitsu, как часть инициативы по созданию фреймворка Flatiron, поэтому он должен быть достаточно перспективным.
Посмотрите nconf на Github.
Мое решение довольно простое:
Нагрузки среды config в ./config/index.js
Определить некоторые значения по умолчанию в ./config/config.global.js
Переопределить значения по умолчанию в ./config/config.test.js
Используя его в ./models/user.js:
Запуск вашего приложения в тестовой среде:
Это объясняется более подробно здесь: http://www.chovy.com/node-js/managing-config-variables-inside-a-node-js-application/
Вы также можете посмотреть на dotenv, в соответствии с принципами двенадцати факторов приложение.
Я использовал, чтобы использовать Node-config, но созданные dotenv по этой причине. Он был полностью вдохновлен Руби'библиотека dotenv С.
Использование довольно простое:
Тогда вы просто создать .файл env и поставить свои настройки в так:
Что'ы dotenv для nodejs.
Вы, ребята, с помощью npm, чтобы запустить свои скрипты (ОКР и т. д.) ?
Если вы используете
.файлы env
вы можете включить их в пакете.формат JSON
и с помощью npm источник/запустить их.Пример:
затем запустить НПМ скрипты:
Его описали здесь https://gist.github.com/ericelliott/4152984 Все кредиты Эрик Эллиот
Вы также можете посмотреть node-config, который загружает конфигурационный файл в зависимости от переменных $HOST и __$NODE_ENV__ (немного похоже на RoR) : documentation.
Это может быть полезно для различных настроек развертывания (
development
,test
илиproduction
).Просто делать простые settings.js
с
экспорт`:Затем, в ваш скрипт, сделать
требуют
:Все настройки теперь будет доступно через "настройки" переменной:
Я'м собираюсь бросить свою шляпу на ринг здесь, потому что ни один из этих ответов решить все важные компоненты, что практически любой системы должен. Соображения:
Здесь's, как я делаю свою конфигурацию:
config.private.js - не в системе контроля версий, это среда конкретных вариантов, которые переопределяют
config.default.private.js`config.public.js - не в системе контроля версий, это среда конкретных вариантов, которые переопределяют
config.default.public.js`ключей
- папка, в которой каждый файл хранит различные секрет какой-то. Это тоже не под контролем версий (ключи никогда не должны быть под контролем версий).Я использую обычный старый JavaScript-файлы конфигурации, так что я имею полное власть на JavaScript язык (в том числе комментарии и возможность делать вещи, как загрузить дефолтовый конфиг файл в среде конкретного файла, так что они могут быть переопределены). Если вы хотите использовать переменные окружения, вы можете загрузить их в этих конфигурационных файлах (хотя я рекомендую использовать переменные окружения по этой же причине я не'т рекомендуем использовать JSON файлы - вы Дон'т иметь мощь языка программирования, чтобы создать свой конфиг).
Причина каждый ключ в отдельном файле предназначен для использования установщика. Это позволяет иметь установки, что создает ключи на машину и сохраняет их в папке ключи. Без этого, ваш установщик может привести к ошибке при загрузке файла конфигурации, который может'т получить доступ к вашим ключам. Таким образом, вы можете пройти в каталог и загружать любые файлы ключей, которые находятся в этой папке, не беспокоясь о том, что существует и то, что не'т в какой-либо определенной версии вашего кода.
Поскольку вы, вероятно, есть ключи загружаются в ваши личные настройки, вы наверняка Дон'т хотите загрузить свой собственный конфиг в любой фронтенд код. Хотя его, вероятно, строго необходимое, чтобы полностью отделить интерфейс от кода серверной части, много раз, что лаваш-это достаточно большой барьер, чтобы помешать людям делать это, таким образом, личное против общественного конфигурации. Но там'ы две вещи, которые я сделать, чтобы предотвратить частная конфигурации, загруженной в интерфейсе:
Одна последняя вещь: ваша конфигурация должна быть загружена в браузер через полностью отдельный файл, чем любой из ваших других код фронтэнда. Если вы связать ваш код фронтэнда, общественного конфигурации должен быть построен как полностью отдельный пакет. В противном случае, ваш конфиг это'т действительно конфиг больше - его только часть вашего кода. Конфиг должен уметь быть разным на разных машинах.
Каторжник еще один вариант, который добавляет схему для проверки. Как nconf, он поддерживает параметры загрузки из любой комбинации переменных окружения, аргументы, файлов и объектов JSON.
Пример из readme:
Начало статьи: Укрощение конфигураций с node-convict
Вы можете использовать конфиг для конкретных условий конфигурационных файлов. Он загружает JSON или YAML config автоматически файлов, он имеет значение по умолчанию и динамические характеристики конфигурации.
Пример из конфиг РЕПО:
В развитии:
В производстве, предположим, что мы запустить приложение с$ NODE_ENV=производство порт=4567 узел app.js`
Более детально : https://github.com/vngrs/konfig
Я создам папку как конфиг файл именования как config.js и позже я буду использовать этот файл везде, где требуется, как показано ниже
Пример config.js
Тогда, если я хочу использовать где-то этот конфигурационный файл
Я сначала импортировать как ниже
ВАР конфиг = требуют('./конфигурация');
и я могу получить доступ к значениям, как показано ниже
Просто используйте
НПМ
модульконфигурации
(более 300000 загрузок)https://www.npmjs.com/package/config
Узел-config, который организует иерархическая конфигураций для развертывания приложения.
Это позволяет определить набор параметров по умолчанию, и распространить их для различных сред развертывания (разработки, тестирования, отладки, производства и т. д.).
Это's лучше, чтобы отделить 'развития' и 'производства' конфиги.
Я использую следующим образом: Вот мой config/index.js файл:
Для требовать настройка используйте следующее:
Чем вы можете использовать объект конфигурации:
Я немного поздно в игре, но я не мог'т найти то, что мне нужно здесь - или нигде - поэтому я написал что-то сам.
Мои требования для механизма конфигурации являются следующие:
- который выглядит так же, но позволяет переопределения конфигурации в settings.js
. Идея здесь легко изменять конфигурацию без изменения кода. Я считаю это полезным для ЗАС.Хотя мне плевать, поддерживающих средах - объясню, как легко добавить его на мое решение
Объяснение
неопределенный
означает, что это свойство является обязательнымmeConf
- в настоящее время код целевой файлприложение
.meConf
- это переопределяет файлов, который предназначен для `Conf в каталоге/dev, которые игнорируют мои СКВ.publicConfiguration
- будет видно из фронт-энд и бэк-энд.privateConfiguration
- будет виден только.sendPublicConfiguration
- маршрут, который будет подвергать открытую конфигурацию и присвоить его глобальной переменной. Например, приведенный ниже код будет подвергать общественного конфигурации как глобальная переменная myConf в переднем конце. По умолчанию он будет использовать глобальную переменную имяconf
и.приложение.вам (и" и quot/серверной/конф&;, требуют (и"конф и").sendPublicConfiguration);
<скрипт в src=" и/серверной/конф?имя=myConf" и тип="и на JavaScript/текст" и>
Логика перекрывает
Добавление поддержки окружающей среды
Хотя я Дон'т найти "в поддержку окружающей среды" не полезна, может кто-то.
Чтобы добавить поддержку окружающей среды необходимо изменить meConf требуют заявление что-то вроде этого (псевдокод)
если ( окружающая среда = = на "постановку" ) { meConf = требуют (и"../Conf в каталоге/dev/meConf и").производства; }
если ( окружающая среда = = на "Развитие", у ) { meConf = требуют (и"../Conf в каталоге/dev/meConf и").развития; }
Аналогичным образом вы можете иметь файл в среде
и импорт правильным. Остальная логика остается той же.
азц примере я просто использовал, потому что я хотел больше гибкости, чем обычно .JSON-файл, но ничего'т хотим, чтобы это абстрагированные в библиотеку, которая потребует зависимость-это что-то вроде этого. В основном, экспорт функция автоматически вызывается, который возвращает объект со значениями, я хотел установить. Дает большую гибкость.
Есть гораздо лучшее объяснение с полный пример здесь. Использование конфигурационных файлов в Node.js
Я знаю, что это очень старый пост. Но я хочу поделиться своим модулем для настройки переменных окружения, я думаю, что это очень гибкое решение. Здесь-модуль в JSON-конфигуратор
Затем вы можете использовать
процесс.ОКР.Переменной NODE_ENV
, чтобы получить все переменные среды.В дополнение к nconf Модуль упоминалось в этот ответ, и узел-конфигурации, упомянутые в этот ответ, также узел-iniparser и IniReader, которые кажутся проще .конфигурации ini парсеров.
Я только недавно выпустила небольшой модуль для загрузки любого типа файлов конфигурации. Это'ы довольно прямо вперед, вы можете проверить его на https://github.com/flesler/config-node
Вы можете использовать pconf: https://www.npmjs.com/package/pconf
Пример: