LINUX.ORG.RU

CLI11 2.5.0

 , , ,

CLI11 2.5.0

0

4

27 февраля, после более года разработки, состоялся выпуск 2.5.0 кроссплатформенной header-only библиотеки для C++ CLI11, предназначенной для разбора параметров командной строки и распространяемой по лицензии BSD 3.

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

Список изменений:

  • улучшен форматтер справки, который лучше согласуется со стандартом UNIX и позволяет использовать сгенерированную справку в help2man;
  • добавлен механизм, позволяющий скрывать группы опций и считать все опции частью родительской группы при отображения справки;
  • добавлен модификатор, позволяющий использовать нестандартные имена опций с одним флагом, например -option;
  • добавлен модификатор для ограничения передачи подкоманд «родителю», что может решить некоторые проблемы с позиционными аргументами;
  • улучшен вывод в конфигурационный файл и добавлен модификатор для управления выводом значений по умолчанию;
  • добавлена возможность указывать pair/tuple по умолчанию и улучшен их парсинг;
  • минимальная необходимая версия CMake теперь 3.10;
  • улучшена документация;
  • исправлены обнаруженные ошибки.

>>> Документация

>>> Подробности API

>>> Подробности на GitHub

★★★★★

Проверено: CrX ()
Последнее исправление: CrX (всего исправлений: 5)

После clap для Rust все подобные библиотеки выглядят максимально архаичными

SL_RU ★★★★
()
Ответ на: комментарий от SL_RU

Можно подумать, что кто-то видел их все.

dataman ★★★★★
() автор топика
Ответ на: комментарий от SL_RU

Ну и как нам ее к С++ прикрутить? И причем тут Rust? У вас своя песочница, у нас своя. Надоели немного заявления в духе «а у вас тут негров линчуют».

gns ★★★★★
()

Ну выглядит прозрачней, чем boost::program_options.

gns ★★★★★
()
Ответ на: комментарий от SL_RU

После раста некоторые и свою ориентацию/пол архаичным считают.

eyrell
()

день дорбый!

кто пользуется, в 3х словах: библиотека действительно помогает «разгрестись» в аргументах или своих велосипедов хватает?

sunjob ★★★★★
()
Ответ на: комментарий от gns

Писать про Руст в таких тредах стоит уже только для того, чтобы посмотреть на тряску неуклонно вымирающих фанатов легаси++.

Clayman ★★
()
Ответ на: комментарий от SL_RU

После clap для Rust все подобные библиотеки выглядят максимально архаичными

После Rust все языки выглядят максимально гетеросексуальными.

Obezyan
()
Ответ на: комментарий от Clayman

Тогда при таком подходе зачем кричать «А на за що?» в каждом треде, где на невинных растоманов нападают злые наСильники?

eyrell
()
Ответ на: комментарий от Obezyan

А вот это, возможно, не очень получится, к сожалению. Хотелось бы, конечно, что бы было, но логика обработки командной строки в виндах, юниксах и все еще живой какой-нибудь OpenVMS ну сильно разная.

gns ★★★★★
()
Ответ на: комментарий от sunjob

Каждая библиотека — это тоже чей-то велосипед. Вопрос удобства, потребностей и ограничений твоего проекта по лицензиям, заимствованиям чужого кода и пр. Ну и личного вкуса. Мне вон как-то пришлось разбор командной строки yacc'ом делать.

gns ★★★★★
()
Ответ на: комментарий от Clayman

Узбагойтесь, нас Руст не трясет от слова совсем.

gns ★★★★★
()
Ответ на: комментарий от gns

Но хотелось бы валидации опций искаропки, например.

в основе разбора комстроки лежит тривиальный токенайзер, как частный случай лексера.

просто берешь следующую лексему(токен) и анализируешь ее тривиальным образом.

и вся «библиотека» заключается в токенайзере строки, что есть кажется в любом язычке.

если нет - пишется за 10 минут и навсегда.

просто посоны сами придумывают себе препятствия, чтобы их преодолевать какими-то «библиотеками».

alysnix ★★★
()
Ответ на: комментарий от alysnix

если нет - пишется за 10 минут и навсегда.

Рассмотрим простейший случай:

(def cli-spec
  {:spec
   {:help {:desc "Show the help"
           :alias :h}
    :config {:desc "Path to config"
             :alias :c
             :validate fs/readable?
             :default "config.yaml"}
    :update {:desc "Update kubectl contexts after login"
             :alias :u
             :default false
             :coerce :boolean}}})

multipass.core> (-> cli-spec cli/format-opts println)
  -h, --help               Show the help
  -c, --config config.yaml Path to config
  -u, --update false       Update kubectl contexts after login
nil

Тут у нас декларативное описание допустимых опций с указанием автовывода типов, значения по умолчанию, проверкой переданных значений, коротких-длинных вариантов и автоматическим построением справки.

Что-то мне подсказывает, вы такое за 10 минут не напишите. А чтука-то полезная, много времени сохраняет.

ugoday ★★★★★
()
Ответ на: комментарий от ugoday

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

а еще оно должно на дудке играть и деньги на бирже зарабатывать. а почему нет? разве это плохо?

  1. типичный пример избыточного проектирования.

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

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

alysnix ★★★
()
Ответ на: комментарий от zbarassky

«На C я делал ошибки, на C++ я их наследую». ©

На сколько-нибудь большой кодовой базе на Ц с «годовыми кольцами», где тебе никто не даст все велосипедить, ты их не только наследуешь в виде легаси, но и комбинируешь со своими.

slackwarrior ★★★★★
()
Ответ на: комментарий от LongLiveUbuntu

header-only

Шо, опять?!

Это у них пройдет, когда выяснят, что руководству срать почему оно все еще «компиляется» (тм), а интереснее почему оно все еще не в проде.

slackwarrior ★★★★★
()
Последнее исправление: slackwarrior (всего исправлений: 2)
Ответ на: комментарий от alysnix

если нет - пишется за 10 минут и навсегда.

Ты даже не рефлексируешь какие у тебя тут ВП. Если навсегда, то должно быть давно кем-то написано и реюзиться, а не каждой кодирующей обезьяной за 10 минут каждый раз с нуля «и навсегда»... до следующего мамкиного писателя токенайзеров.

slackwarrior ★★★★★
()

Острое желание раскритиковать проект.

    CLI11_PARSE(app, argc, argv);

Это что, макрос? Люди десятилетиями пытаются убрать макросы из С++.

 throw: 17 matches

Throw не нужен и мешает. Можно мне библиотеку без throw?

sarumeister
()
Ответ на: комментарий от slackwarrior

Ты даже не рефлексируешь какие у тебя тут ВП. Если навсегда, то должно быть давно кем-то написано и реюзиться, а не каждой кодирующей обезьяной за 10 минут каждый раз с нуля «и навсегда»… до следующего мамкиного писателя токенайзеров.

не хочешь мамкиных, бери папкиных.

https://en.cppreference.com/w/cpp/string/byte/strtok

alysnix ★★★
()
Ответ на: комментарий от alysnix

а для разбора комстроки надо целую библиотеку??? а ребята не знали.

А ребятам это и не нужно, для их «приветмиров».

dataman ★★★★★
() автор топика
Ответ на: комментарий от gns

Но хотелось бы валидации опций искаропки, например.

В сабже есть несколько: https://github.com/CLIUtils/CLI11?tab=readme-ov-file#validators. И можно легко добавлять свои валидаторы.

Есть много других парсеров на:
https://github.com/fffaraz/awesome-cpp/tree/master?tab=readme-ov-file#cli
и
https://github.com/p-ranav/awesome-hpp?tab=readme-ov-file#argument-parsers

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

dataman ★★★★★
() автор топика
Ответ на: комментарий от sarumeister

Это что, макрос? Люди десятилетиями пытаются убрать макросы из С++.

Потому что сохранена совместимость с C++11.
Есть куча других аналогов и для С++17 и выше.

dataman ★★★★★
() автор топика
Ответ на: комментарий от alysnix

Так и есть. В своих поделках всегда использую свой собственный разбор командной строки на 10 строк кода.

Reset ★★★★★
()
Ответ на: комментарий от SL_RU

После clap для Rust все подобные библиотеки выглядят максимально архаичными

#include <CLI/CLI.hpp>
#include <string>

int main(int argc, char **argv) {
    std::string input_file_name, output_file_name;
    int level{5}, subopt{0};

    // app caption
    CLI::App app{"CLI11 help"};

    app.require_subcommand(1);
    // subcommands options and flags
    CLI::App *const encode = app.add_subcommand("e", "encode")->ignore_case();  // ignore case
    encode->add_option("input", input_file_name, "input file")
        ->option_text(" ")
        ->required()
        ->check(CLI::ExistingFile);                                                               // file must exist
    encode->add_option("output", output_file_name, "output file")->option_text(" ")->required();  // required option
    encode->add_option("-l, --level", level, "encoding level")
        ->option_text("[1..9]")
        ->check(CLI::Range(1, 9))
        ->default_val(5);                                   // limit parameter range
    encode->add_flag("-R, --remove", "remove input file");  // no parameter option
    encode->add_flag("-s, --suboption", subopt, "suboption")->option_text(" ");

    CLI::App *const decode = app.add_subcommand("d", "decode")->ignore_case();
    decode->add_option("input", input_file_name, "input file")->option_text(" ")->required()->check(CLI::ExistingFile);
    decode->add_option("output", output_file_name, "output file")->option_text(" ")->required();

    // Usage message modification
    std::string usage_msg = "Usage: " + std::string(argv[0]) + " <command> [options] <input-file> <output-file>";
    app.usage(usage_msg);
    // flag to display full help at once
    app.set_help_flag("");
    app.set_help_all_flag("-h, --help");

    CLI11_PARSE(app, argc, argv);

    return 0;
}

Ничуть не хуже clap.
И сколько у clap зависимостей от других крейтов, больше 10?
А CLI11 зависит только от std.

dataman ★★★★★
() автор топика
Ответ на: комментарий от rupert

Им за каждое упоминание раста по десять рубликов дают.

Один раст не кхм-кхм-раст.

Таки хде мои шекели?

bdrbt
()
Ответ на: комментарий от dataman

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

Кстати зависимости clap (текущей версси):

unicase = { version = "2.6.0", optional = true } // юникод
strsim = { version = "0.11.0",  optional = true } // хз
anstream = { version = "0.6.7", optional = true } // цвятной терминал
anstyle = "1.0.8" // анси 
terminal_size = { version = "0.4.0", optional = true } // Gets the size of your Linux or Windows terminal
backtrace = { version = "0.3.73", optional = true }
unicode-width = { version = "0.2.0", optional = true } // считать ширину символов

Если честно - пахнет npm

bdrbt
()
Ответ на: комментарий от Reset

Из этого следует только то, что никогда не приходилось писать для других.

Даже полстранички шелла, если есть какие параметры, а не просто «сделай мне збс!», нуждаются в поддержке ‘-h/–help’.

AlexM ★★★★★
()
Ответ на: комментарий от ya-betmen

Посмотрел я на размер сырцов, это точно плюс?

Это C-плюс-плюс!

theNamelessOne ★★★★★
()
Ответ на: комментарий от dataman

Ну вот этим мне библиотека и понравилась. И буст только ради program_options тащить не надо.

gns ★★★★★
()
Ответ на: комментарий от Reset

В среднем да, getopt хватает. Но мне как-то понадобилась сложная командная строка. Пришлось парсер на yacc сочинять.

gns ★★★★★
()
Ответ на: комментарий от ya-betmen

Посмотрел я на размер сырцов, это точно плюс?

$ tokei include:

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 Language              Files        Lines         Code     Comments       Blanks
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 C++ Header               26        12237         8853         1781         1603
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 Total                    26        12237         8853         1781         1603
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

Да, точно.

dataman ★★★★★
() автор топика
Ответ на: комментарий от dataman

8 тыс строк кода на парсинг комстроки? интерпретатор простого лиспа можно сделать в 1 тыще си строк.

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

alysnix ★★★
()
Последнее исправление: alysnix (всего исправлений: 1)
Ответ на: комментарий от alysnix

можно целые программы со сборкой мусора писать. не?

А можно начинать предложения с правильного регистра? А то парсить трудно.

dataman ★★★★★
() автор топика
Ответ на: комментарий от dataman

А то парсить трудно.

восьми тыщ строк хватит на все. и даже на регистр.

alysnix ★★★
()
Ответ на: комментарий от dataman

Но, чот здоровата библиотечка, это тут коллеги правильно указывают.

gns ★★★★★
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.