Есть много способов настроить программу. Некоторые используют интерфейсы командной строки, другие используют файлы конфигурации. Любые изменения настроек могут потребовать рефакторинга многих строк кода. Процесс загрузки конфигурации должен быть очень надежным. В противном случае программы не могли бы работать так, как мы ожидали. К сожалению, программы голанг не исключение. Например, добавление нового аргумента в 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, пожалуйста, посетите: