Работа с commons-cli 1

По време на работа по един проект се наложи разработването на конзолно приложение за отдалечен достъп до системата. За първи път се заех с такова нещо в такъв мащаб, преди всичко да беше на прозорците, или ако конзолата, тогава броят, типът и редът на предаваните параметри са известни със сигурност. И тук имаше нужда от голям брой команди, всяка със собствени параметри или изобщо без тях, съответно, за да се осигури гъвкавост, имаше нужда от анализатор на предадените параметри.

За да не преоткривам колелото, реших да взема готова библиотека. Изборът беше направен на commons-cli, успяхме да намерим няколко примера за него и използването му не изглеждаше много сложно.

Както се оказа, примерите не са много и покриват само основните нужди на разработчика. Ще се опитам да запълня тази празнина с моите обяснения. И така, да започваме. Commons-cli се основава на концепцията за опция. За да изясним веднага, нека се опитаме да дефинираме терминологията. Помислете за този ред:

Text.exe –l вход ––парола 123456

Програмата test.exe се извиква с помощта на опцията l, която приема низа "login" като аргумент, и с помощта на опцията за парола, като аргументът е под формата на низа "123456". Лесно е да се досетите, че програмата изисква удостоверяване, опцията l е отговорна за входа, а самата опция за парола е за паролата. За простота можете да разгледате двойката "опция, аргумент" по класическия начин "параметър = стойност".

Между другото, нотацията със знака "=" е доста приемлива при използване на commons-cli.

Опциите може изобщо да нямат аргументи или може да има повече от един аргумент. Ако името на опцията се състои от 1 буква, то се предшества от "-" (да го наречем с обикновено "тире"). Ако името на опцията се състои от 2 или повече букви, тогаватрябва да удвоите "тирето", както при опцията за парола.

Разбрахме терминологията, можете да преминете директно към кода. И така, всичко започва с опциите. Създаваме опция:

Конструкторът в този случай приема 4 параметъра: кратката форма на опцията (опция с една буква), дългата форма на опцията, флаг, показващ наличието на параметри, и текстово обяснение на тази опция. Можем да посочим само еднобуквено представяне на опцията или само разширеното представяне на опцията, във всеки от тези случаи конструкторът ще приеме 3 параметъра, но е невъзможно да не посочим многобуквена или еднобуквена опция, поне една трябва да бъде посочена. След това трябва да определите как тази опция ще работи с аргументи. така:

Сега трябва да създадете анализатор на командния ред и да му предоставите необходимата информация, за да работи:

Като начало създаваме анализатор, пълноценни анализатори в commons-cli 2 - анализатора на Posix и анализатора на GNU. Честно казано, не се задълбочих в разликите им, но след бегъл преглед харесах Posix анализатора (той е регулиран от Posix стандарта и съответно ще работи за всички системи, които поддържат този стандарт). След това стартираме анализатора, като параметри, методът за анализ приема колекция от опции под формата на обект Options и действителния низ с параметрите, които са били предадени на вашата програма при стартиране (от само себе си се разбира, че стандартните args[ ] масивът трябва да се комбинира в един ред преди употреба, като елементите се разделят с интервали). Резултатът от анализирането ще бъде върнат в обекта commandLine.

Сега трябва да изпълните получените команди, това се прави по следния начин:

Както можете да видите, работата с commons-cli е доста проста. В допълнение, тази библиотека ще се погрижи за показването на помощ при използването на програмата, не напълно, но ще улесни много:

На всичкистана ясно, ще дам пример за извикване на този метод:

Може би всичко е ясно тук, с изключение на термина "използване на низ". Ще дам примерен пример, от който ще стане ясно как да използвате този параметър. Ако е зададено на true, изходът ще бъде нещо подобно:

използване: java test.jar [-l ] [-h]

Ако е зададено на false, изходът ще изглежда така:

използване: java test.jar

Мисля, че разликата е ясна.

Последният е групите опции. Например, има две опции -a и -b, те са взаимно изключващи се, тоест не могат да бъдат посочени едновременно. За такъв случай се създават групи от опции:

Също така е доста просто.

Като цяло библиотеката остави добро впечатление за използване, но много бързо започна да липсва. Текущата версия на библиотеката е 1.2, докато се разработва изцяло нова версия 2.0 - всъщност, според описанието на api версия 2.0, можем да кажем, че тази версия трябва да задоволи повечето нужди от cli библиотеки.

Плюсове на commons-cli:

  • лекота на използване
  • групи опции
  • дълги и кратки обозначения на опции (-l, --login)
  • възможност за анализиране на опции като -ab, когато има две опции -a, -b
Недостатъци (от моите собствени нужди, и разбира се има повече от тях):
  • няма възможност за създаване на подкоманди (тъй като в git има команди за разклонение, състояние и т.н. със собствени опции)
  • не е много удобна работа с аргументи на опции, ако има повече от 1
В резултат на това за прост cli - отлично решение, нещо по-сериозно да търсите алтернативи или да чакате версия 2.0.

UPD. При подканата nord_ua коригира връзката към стандартния команден ред Posix. Коригирани са правописни грешки и е добавена връзка към commons-cli. Благодаря на nik_lazarev и FractalizeR.

Hardcore conf в C++. Ние само канимпрофесионалист