Как вы обрабатываете параметры командной строки и файлы конфигурации?

Какие пакеты вы используете для обработки параметров командной строки, настроек и файлов конфигурации?

Я ищу что-то, что читает пользовательские параметры из командной строки и/или из файлов конфигурации.

Параметры (настройки) должны быть разделены на разные группы, поэтому я могу передавать разные (подмножества) параметры для разных объектов в моем коде.

Я знаю boost::program_options, но я не могу привыкнуть к API. Существуют ли легкие альтернативы?

(Кстати, вы когда-нибудь использовали объект глобальных опций в своем коде, который можно читать откуда угодно? Или вы считаете это зло?)

Ответ 1

Ну, тебе не понравится мой ответ. Я использую boost::program_options. Интерфейс немного привыкает, но как только вы его обманываете, это потрясающе. Просто убедитесь, что выполняете лодку модульного тестирования, потому что если вы получите синтаксис неправильно, вы будете получать ошибки времени выполнения.

И, да, я храню их в одном объекте (только для чтения). В этом случае я не считаю это злым. Это один из немногих случаев, когда я могу подумать о том, где синглтон является приемлемым.

Ответ 2

В Google мы используем gflags. Он не выполняет конфигурационные файлы, но для флагов это намного менее болезненно, чем использование getopt.

#include <gflags/gflags.h>
DEFINE_string(server, "foo", "What server to connect to");
int main(int argc, char* argv[]) {
    google::ParseCommandLineFlags(&argc, &argv, true);
    if (!server.empty()) {
        Connect(server);
    }
}

Вы помещаете DEFINE_foo в верхнюю часть файла, который должен знать значение флага. Если другие файлы также должны знать значение, вы используете DECLARE_foo в них. Там также неплохая поддержка для тестирования, поэтому модульные тесты могут устанавливать разные флаги независимо.

Ответ 4

Если Boost для вас переполнен, GNU Gengetopt, вероятно, тоже, но ИМХО, это забавный инструмент, с которым можно обойтись.

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

(Что касается того, что я использую лично, для всего недавно это была проприетарная библиотека анализа синтаксиса командной строки, которую кто-то еще написал в моей компании, но это не очень помогает вам, к сожалению)

Ответ 5

Я использую TCLAP уже год или два, но случайно я наткнулся на ezOptionParser. ezOptionParser не страдает от того, что "он не должен быть таким сложным" - синдром так же, как и другие парсеры.

Я до сих пор впечатлен, и я, скорее всего, буду использовать его в будущем, особенно потому, что он поддерживает файлы конфигурации. TCLAP - более сложная библиотека, но простота и дополнительные возможности от ezOptionParser очень привлекательны.

Другие льготы с его сайта включают (от 0.2.0):

  • Довольно распечатка разобранных входов для отладки.
  • Создание автоматического использования сообщений в трех макетах (выровненный, чередующийся или пошагово).
  • Реализация одиночного заголовочного файла.
  • Зависит только от STL.
  • Произвольные короткие и длинные имена опций (тире '-' или плюс '+' префиксы не требуются).
  • Произвольные разделители списков аргументов.
  • Разрешено несколько экземпляров флагов.
  • Проверка требуемых параметров, количество ожидаемых аргументов за флаг, диапазоны типов данных, диапазоны, определенные пользователем, членство в списках и регистр для строковых списков.
  • Критерии проверки, определяемые строками или константами.
  • Несколько импорт файлов с комментариями.
  • Экспорт в файл, либо задание параметров, либо все параметры, включая значения по умолчанию, когда они доступны.
  • Опция parse index для контекстов, зависимых от заказа.

Ответ 6

GNU getopt довольно приятный. Если вы хотите чувствовать С++, рассмотрите getoptpp, который является оберткой вокруг родного getopt. Что касается файла конфигурации, вы должны попытаться сделать его настолько глупым, насколько это возможно, чтобы синтаксический анализ был простым. Если вы немного внимательны, вы можете использовать yaac & lex, но это будет действительно большой бакс для небольших приложений.

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

Ответ 8

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

С другой стороны, для конфигурационного файла вы действительно не можете побить формат на основе XML. Это читаемый, расширяемый, структурированный и т.д.:) Кроме того, есть много XML-парсеров. Несмотря на то, что это библиотека C, я обычно использую libxml2 из xmlsoft.org.

Ответ 9

Попробуйте Apache Ant. Его основное использование - проекты Java, но в нем нет ничего Java, и его можно использовать практически для чего угодно.

Использование довольно простое, и у вас есть много поддержки сообщества. Это действительно хорошо, когда вы делаете то, о чем вы просите.

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