Есть много способов настроить программу. Некоторые используют интерфейсы командной строки, другие используют файлы конфигурации. Любые изменения настроек могут потребовать рефакторинга многих строк кода. Процесс загрузки конфигурации должен быть очень надежным. В противном случае программы не могли бы работать так, как мы ожидали. К сожалению, программы голанг не исключение. Например, добавление нового аргумента в CLI требует создания флага, анализа данных, работы с разделом справки, управления значениями по умолчанию и влияния на собранное значение в структуру конфигурации.
Закройте глаза и представьте себе библиотеку, способную автоматически управлять всем этим процессом настройки за вас. Вы можете их открыть, потому что это сделали мы :)
Flæg
Flæg - это пакет Go для динамического построения мощного современного интерфейса командной строки и загрузки структуры конфигурации программы из аргументов. Разработчикам Go больше не нужно беспокоиться об обновлении флагов и команд: все работает само по себе!
Пакет Flæg родился из-за необходимости в Træfik, знаменитом обратном прокси-сервере, созданном Emile Vauge. Становилось все труднее поддерживать список `flags`: параметров, передаваемых в качестве аргумента, которые управляют программой.
Благодаря Flæg техническое обслуживание осталось в прошлом. Флаги автоматически генерируются из имен полей структуры конфигурации. Для этого разработчикам достаточно добавить StructTag после поля, чтобы установить на нем флажок. Помощник (то есть то, что отображается с аргументом -help) генерируется из ключа `description` в StructTag
Вот пример сложной конфигурации с StructTag, которую может обработать Flæg:
Flæg может загружать значения аргументов, заданные в структуре конфигурации, через отражение. Пакет поддерживает большинство типов полей, но не коллекций. Надеюсь, пользователи смогут добавить собственный синтаксический анализатор для определенных типов в виде коллекций или даже целых структур.
Давайте посмотрим, насколько просто использовать Flæg.
Сначала мы создадим тривиальную команду, которая ничего не делает, кроме печати конфигурации:
Затем нам нужно только создать объект Flæg и вызвать функцию Run:
Давайте попробуем эту программу. Сначала вызовем помощника:
Как видите, сгенерированные флаги соответствуют полям структуры конфигурации с подструктурами DatabaseInfo и OwnerInfo. Значения по умолчанию можно определить непосредственно в полях структуры конфигурации. Эти поля останутся неизменными, если их «флаги» не используются в аргументе.
Затем мы можем попробовать программу:
Flæg также обрабатывает подкоманды, такие как команда «версия» в примере:
Чтобы узнать больше о Flæg, посетите страницу проекта github https://github.com/containous/flaeg.
Благодаря Flæg у нас есть отличное решение для загрузки конфигурации из флагов. Теперь обслуживание стало проще, чем раньше, что ценится в проектах с открытым исходным кодом. Но как мы можем объединить эту конфигурацию CLI с другими источниками, такими как файлы конфигурации?
Stært
Интерфейс командной строки - не единственный способ настроить программу. Есть и другие источники конфигурации. Например, Træfik может брать конфигурацию из флагов, из файла конфигурации и из распределенного хранилища ключей и значений.
Мы создали Stært, чтобы объединить эти источники конфигурации. Пока реализованы только флаги (с использованием Flæg), конфигурационный файл TOML и конфигурация Key-Value Stored, но мы сделали пакет таким образом, чтобы было легко добавлять другие источники.
Stært использует тот же Тип команды, что и Flæg.
Нам просто нужно создать несколько источников:
Затем мы можем создать объект Stært и использовать его:
Stært загрузит конфигурацию в строку и перезапишет ее в следующем порядке:
- Источник хранилища ключей и значений
- Источник Flæg
- Источник файла конфигурации TOML
Вот пример файла TOML:
И есть способ сохранить ключ-значение:
Это был простой пример того, что мы можем делать с Stært.
В заключение, эти два пакета позволили нам сэкономить много времени на Træfik project. Теперь мы можем загрузить и объединить несколько конфигураций из разных источников. Любые изменения в структуре конфигурации обрабатываются автоматически.
Дополнительные функции описаны на страницах проекта Github, пожалуйста, посетите: