Как вы обрабатываете параметры командной строки и конфигурационные файлы? - PullRequest
11 голосов
/ 13 июня 2009

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

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

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

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

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

Ответы [ 9 ]

11 голосов
/ 13 июня 2009

В 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 в них. Также имеется довольно хорошая поддержка для тестирования, поэтому модульные тесты могут устанавливать разные флаги независимо друг от друга.

6 голосов
/ 15 июня 2009

Для командных строк и C ++ я был поклонником TCLAP: шаблонизированный анализатор аргументов командной строки.

http://sourceforge.net/projects/tclap/

5 голосов
/ 13 июня 2009

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

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

3 голосов
/ 10 апреля 2013

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

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

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

  • Хорошая печать разобранных входов для отладки.
  • Автоматическое создание сообщения об использовании в трех макетах (выровненный, чередующийся или в шахматном порядке).
  • Реализация одного файла заголовка.
  • Зависит только от STL.
  • Произвольные короткие и длинные имена опций (префиксы тире '-' или плюс '+' не требуются).
  • Разделители списка произвольных аргументов.
  • Допускается несколько экземпляров флага.
  • Проверка обязательных параметров, количества ожидаемых аргументов для флага, диапазонов типов данных, пользовательских диапазонов, членства в списках и регистра для строковых списков.
  • Критерии проверки, определяемые строками или константами.
  • Импорт нескольких файлов с комментариями.
  • Экспортирует в файл, либо устанавливает параметры, либо все параметры, включая значения по умолчанию, если они доступны.
  • Индекс разбора опций для контекстно-зависимых контекстов.
3 голосов
/ 13 июня 2009

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

И я стараюсь держаться подальше от объектов глобальных опций, я предпочитаю, чтобы каждый класс читал свою собственную конфигурацию. Помимо целой философии «Globals are evil», она в конечном итоге превращается в постоянно растущий беспорядок, в котором все ваши конфигурации находятся в одном месте, а также сложнее сказать, где и где используются переменные конфигурации. Если вы держите конфигурацию ближе к месту ее использования, становится более очевидным, для чего она нужна, и ее легче поддерживать в чистоте.

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

1 голос
/ 13 июня 2009

Если вы работаете с Visual Studio 2005 на x86 и x64 Windows, в библиотеке SimpleLibPlus есть несколько хороших утилит для анализа командной строки. Я использовал это и нашел это очень полезным.

1 голос
/ 13 июня 2009

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

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

0 голосов
/ 13 июня 2009

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

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

0 голосов
/ 13 июня 2009

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

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

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

...