изображение alexchoffy.
Есть много хороших подходов для обработки конфигурации в современном применении. Теперь мы используем такие вещи в качестве файлов конфигурации, переменные среды, параметры командной строки, а также шаблоны конфигурации CI и файлы конфигурации на Fly, удаленные серверы конфигурации, специфические сопоставления и услуги привязки и еще более сложные вещи.
Но цель такая же — укажите приложение с конфигурацией, которая быстро становится и простой в использовании. Но как это сделать?
Как наши приложения потребляют конфигурации
Как хороший разработчик, я всегда сражаюсь с неявным. Я не использую глобальные переменные, я структурую мой код читабельный путь и пусть мой код будет определен определенным и понятен. Есть что-то, что я действительно не люблю — переменные среды, потому что они одинаковы плохими, что и глобальные переменные. Но вы можете справиться с ними правильно, если вы прочитаете их один раз в начале.
Таким образом, основная идея состоит в том, чтобы получить настройки приложения от того места, где они есть (файл, env, удаленный сервер и т. Д.) И распределяют их через приложение, чтобы сделать их доступными, где они не требуются. Простая задача, а? Но все еще так много разных способов сделать это.
Многие подходы, еще больше инструментов
Так что довольно ясно, как получить конфиги. У каждого подхода есть собственные лучшие практики. Но что делать дальше? Нет общего ответа.
Некоторые библиотеки (например, Viper Configs хранилища в качестве значения ключа набор в глобальной области. Довольно полезно, но очень неявной. В рамках больших проектов иногда вы можете просто потерять, как одна или другая переменная пришла в это состояние.
Другие библиотеки поставьте все в одном ведре — среда, файлы, параметры командной строки. Даже есть хорошая структура со всеми значениями конфигурации, которая все еще выглядит неясно и бесполезно для меня. Обычно приложение использует либо подход командной строки (CLI Tools), либо подход к конфигурации файла + окружающей среды (веб-сервисы, контейнерные приложения и т. Д.).
Есть много действительно хороших библиотек для управления аргументом командной строки, как Go-флаги И я не думаю, что это есть причина, чтобы поставить все в одном инструменте.
Но оба подхода имеют ту же проблему — много магии внутри.
Магия
Иди не является языком для всех. Он имеет много ботингов, тип типа не столько простирается, а возможности ООП очень ограничены. Но есть хорошая вещь, которая стоит того — это мгновенно читаемо, у него нет магии внутри. И мне это нравится.
Но работа с конфигами часто сложно, в свою очередь. Даже если вы определяете структуру вместо использования небезопасной карты, вы все равно должны объявить, какие переменные среды вы используете. Нет худшего, что и глобально используемые переменные среды. Но даже если структура содержит явное отображение каждой переменной окружающей среды, все еще трудно настроить среду за пределами приложения. Кто-то (это может быть вы, другой разработчик, DevOps или только кто-то вынужден сделать это) должен найти список используемых переменных среды, а затем использовать их правильно.
Хорошо, они могут быть перечислены в документации или в исходном коде. Но оба плохие. Документация может быть устарела, а исходный код нуждается в времени и навыка для чтения.
На мой взгляд, единственный надлежащий способ сделать это — добавьте полный список переменных среды в вывод справки, включая описания, значения по умолчанию и другую значимую информацию.
Я не нашел ничего не преодоленного, но все еще полезен, с явной настройкой конфигурации и чистой и информативной помощи, поэтому я построил его самостоятельно.
Один способ управлять им весь чистый способ
Итак, я проанализировал многие популярные библиотеки управления конфигурацией и решили построить свой собственный. Почему? Там пара причин:
обрабатывать файлы конфигурации и переменные среды, а не параметры командной строки; нет волшебного, явного способа читать и использовать конфигурацию; Нет неявных имен, все сопоставление должно быть сделано с использованием тегов; хорошая и информативная вывод помощи; Легкая интеграция с другими библиотеками.
И вот мы: Cleanenv Библиотека теперь выпущена и доказана в производстве.
Давайте поговорим о своих основных особенностях.
Явная структура конфигурации
Основная идея за библиотекой CleanenV состоит в том, чтобы сделать все явное и чистить. Нет глобального государства, без инкапсулированных карт Нет волшебного фона обновляет отвязку любые другие скрытые работы.
Все становится чистым и видимым. И именно поэтому структурированный формат был выбран в качестве основы для конфигурации. Структура (как глубокий и сложный, как вы хотите) использовать для анализа файлов конфигурации и переменных среды. Это также хорошее место для записи конфигурации документации.
Явное название и варианты
Следующий этап «No-Magic» — это явная имена имена переменной. Таких вещей, таких как сложные генераторы для имени окружающей среды на основе вложенных структурных имен — вам приходится устанавливать имена AS-IS, так что вы можете легко найти их с помощью поиска.
Для распределения файлов мы используем тот же подход, что и соответствующие библиотеки — JSON, YAML, TOML и т. Д.
Вот пример простой структуры конфигурации сервера:
type ConfigDatabase struct { Port string `yml:"port" env:"PORT" env-default:"5432"` Host string `yml:"host" env:"HOST" env-default:"localhost"` Name string `yml:"name" env:"NAME" env-default:"postgres"` User string `yml:"user" env:"USER" env-default:"user"` Password string `yml:"password" env:"PASSWORD"` }
Эта структура может использоваться для анализа файла конфигурации YAML, а затем прочитать некоторые данные из среды. Во-первых, он прочитал файл, а затем попытаться найти переменные среды, используя имена в env
Теги. Если не было данных, не найденных в файле ни в среде, константу из env-default
будет использоваться вместо этого.
Поддерживаемые типы данных:
- целые числа;
- числа плавающих точек;
- строки;
- логические
- массивы (с настраиваемым сепаратором);
- Карты (с настраиваемым сепаратором);
Вычитаемый вывод помощи
Современные контейнерные приложения используют переменные среды в качестве основной конфигурации. Таким образом, приложение может иметь до сотен переменных, оно зависит. Общая проблема заключается в том, что точный список переменных часто является неопределенным или устаревшим (или даже стоит, они распределяются через приложение и читаются в некоторых неожиданных местах).
Чтобы исправить, что библиотека CleanenV содержит возможность добавления хорошо структурированного списка переменных среды с описаниями в вывод справки:
import github.com/ilyakaznacheev/cleanenv type ConfigServer struct { Port string `env:"PORT" env-description:"server port"` Host string `env:"HOST" env-description:"server host"` } var cfg ConfigRemote help, err := cleanenv.GetDescription(&cfg, nil) if err != nil { ... }
Вы получите следующее:
Environment variables: PORT server port HOST server host
Это поможет вам получить документацию, синхронизированную с вашим приложением без необходимости иметь дополнительные файлы.
Интеграция
Простота — это все. Но я хочу не только дать простой инструмент, но и облегчить использование с другими кодами.
Теперь вы можете легко комбинировать это с Флаг
Функция справки библиотеки:
type config struct { Port string `env:"PORT" env-description:"server port" env-default:"5432"` Host string `env:"HOST" env-description:"server host" env-default:"localhost"` Name string `env:"NAME" env-description:"server name" env-default:"postgres"` User string `env:"USER" env-description:"server username" env-default:"user"` Password string `env:"PASSWORD" env-description:"server password"` } var ( cfg config cfgPath string ) fset := flag.NewFlagSet("My app", flag.ContinueOnError) fset.StringVar(&cfgPath, "cfg", "", "path to config file") fset.Usage = cleanenv.FUsage(fset.Output(), &cfg, nil, fset.Usage) fset.Parse(os.Args[1:])
Если вы запустите Go Run your_app.go -h
Вывод будет:
& go run your_app.go -h Usage of My app: -cfg string path to config file Environment variables: PORT string server port (default "5432") HOST string server host (default "localhost") NAME string server name (default "postgres") USER string server username (default "user") PASSWORD string server password
Возможность сделать больше
Это приятно, но вам может понадобиться больше. Например, вы можете получить конфигурацию с удаленного сервера или другого инструмента или обновить их. Для этого вы можете использовать возможности улучшения библиотеки. Есть несколько способов написать свою собственную логику, чтобы прочитать данные из своего собственного источника. Читайте больше в Документация Отказ
Заключение
Итак, Cleanenv Библиотека не является ключом для каждого блокировки. Это определенно не инструмент для — все. Но он предназначен для простых, чистых и читаемых, но достаточно гибких, если вам это нужно.
Ильяказначеев/Cleanenv.
✨clean и Minimalistic Configuration окружающей среды для Golang
Итак, я счастлив, если это поможет вам. Я активно использую его в моих проектах, поэтому оно продуктивно.
Кроме того, не стесняйтесь просить любые функции, которые вы считаете полезными.
И оставайся чистым!
Оригинал: «https://dev.to/ilyakaznacheev/clean-configuration-management-in-golang-1c89»