Мы установили, что конфигурация важна. Большой! Но как использовать конфигурацию в проектах на Node.js? Наш подход к настройке описан ниже. Это не единственный способ настроить ваш проект, но мы решили сделать это именно так.

Это вторая часть из четырех частей - вы можете начать с первой части ниже!





Мы открыли исходный код для нашего модуля конфигурации, и это наш способ немного помочь сообществу. Точно такой же, который мы используем в наших проектах. Вы можете найти его на https://github.com/myob-oss/node-config. Он также опубликован на npm, и вы можете установить его, выполнив следующую команду:

npm install --save @myob-oss/config

Написанный нами модуль был вдохновлен другими конфигурационными библиотеками (такими как Ruby on Rails, Apache Sling и другими конфигурационными модулями Node.js). Нам был нужен простой и предсказуемый модуль конфигурации, в котором работающую конфигурацию было легко понять и легко изменить настройки.

В нашем модуле конфигурации нет ничего нового или излишне необычного. Он просто слегка самоуверен и написан для одной цели. Файлы конфигурации не могут быть изменены приложением, которое их использует. Файлы конфигурации затем становятся артефактами, что упрощает понимание текущей конфигурации. В нашей производственной среде автоматически сгенерированный файл runtime.json имеет всю конфигурацию, используемую приложением. Если мы хотим знать, какие настройки использует приложение, мы просто смотрим на этот файл. Простой! Предсказуемо!

Основная сила и гибкость нашего модуля конфигурации сводится к концепции наложений. Под этим я подразумеваю, что вы можете наложить конфигурацию из среды по умолчанию с настройками для машинной среды и, наконец, вы можете наложить среду выполнения поверх двух других настроек для окончательных настроек конфигурации.

Наш модуль конфигурации ожидает, что все файлы конфигурации будут храниться в каталоге /config в корне вашего проекта. Файлы конфигурации находятся в формате JSON. Он использует два «волшебных» файла: default.json и runtime.json. default.json содержит настройки, общие для всех сред, а файл runtime.json содержит настройки, специфичные для машины, на которой выполняется проект.

В каждом проекте также есть файлы конфигурации среды: dev.json, test.json и production.json (у нас есть другие файлы для других сред, которые мы запускаем). Эти файлы среды обычно содержат сведения о подключении к базе данных и адреса служб, соответствующие каждой среде. Мы используем переменную среды NODE_ENV, чтобы определить, какой файл среды использовать.

Мы не храним пароли или учетные данные ни в одном из наших файлов конфигурации, которые отслеживаются системой управления версиями. Вы никогда не должны этого делать! Это сделано для того, чтобы разработчики не имели доступа к деталям производственной базы данных или любой другой конфиденциальной информации доступа.

Лучше всего наглядно представить, как работает система наложения, на примере. Представьте, что у нас есть default.json файл со следующими настройками:

{
  "foo": "bar",
  "barry": "has hair"
}

А также представьте, что у нас есть test.json файл со следующими настройками:

{
  "barry": "has a chrome dome",
  "alice": "is a coder"
}

И, наконец, представьте, что у нас есть runtime.json файл со следующими настройками:

{
  "alice": "is an awesome coder",
  "foo": "baz",
  "fruit": "mango"
}

Тогда окончательный результат конфигурации для NODE_ENV=test будет:

{
  "foo": "baz",
  "barry": "has a chrome dome",
  "alice": "is an awesome coder",
  "fruit": "mango"
}

Здесь вы можете видеть, что значение «barry» было наложено из значения default.json значением test.json среды, а значение «alice» было наложено из среды test.json значением runtime.json. Очевидно, что это выдуманные настройки, но они должны дать вам общее представление о том, как работает система наложения.

Поскольку файлы конфигурации находятся в формате JSON, любой ключ может иметь значение, которое может быть: строкой, числом, массивом или объектом. Наличие объектов отлично подходит для организации разделов в файлах конфигурации:

{
  "express": {
    "host": "localhost",
    "port": 1337
  },
  "mysql": {
    "host": "192.168.56.101",
    "port": 3306
  }
}

Мы не храним runtime.json файлы в наших репозиториях исходного кода (мы игнорируем файл в репозиториях Git). Это связано с тремя причинами.

Во-первых, файл runtime.json создается с помощью нашего процесса автоматического развертывания, и мы не хотим, чтобы настройки локального разработчика случайно запустились на наших серверах.

Во-вторых, мы не хотим нарушать работу проектов на наших локальных машинах (или машинах других разработчиков), обновляя наш код и изменяя конфигурацию без нашего ведома.

В-третьих, пароли и учетные данные могут храниться в файле runtime.json, и нам не нужна эта информация в наших репозиториях.

Каждому разработчику нравится работать немного по-своему. Я никогда не встречал двух разработчиков, которые работали бы одинаково. Наш модуль конфигурации дает разработчику свободу настраивать свою машину так, как они хотят. Все, что отличается от базовой среды, они могут добавить в свой runtime.json файл, и это никому не помешает.

Все проекты Node.js нашей команды используют один и тот же модуль конфигурации. Как только разработчик научится его использовать, он сможет легко понять, как настроены все другие проекты Node.js. Они могут быстро и легко внести изменения в конфигурацию или добавить новые параметры по мере необходимости. Лучше всего то, что им нужно изучить только один тип конфигурации.

Я надеюсь, что это было полезно для понимания некоторых внутренних механизмов настройки наших проектов нашей командой.

В следующем посте этой серии будет объяснено, как наша конфигурация создается автоматически при развертывании наших приложений.

А пока не стесняйтесь оставлять любые вопросы или отзывы в разделе комментариев ниже!