4

Я изучаю Groovy CliBuilder, и я нахожу это замечательным, за исключением того, что я не знаю, как распознать неправильные аргументы. Рассмотрим следующий пример кода:Groovy CliBuilder, как распознать неправильные аргументы?

def cli = new CliBuilder() 
cli.s args: 1, longOpt: 'sdkdir', 'sdkdir usage info' 
cli.h args: 0, longOpt: 'help', 'print usage information' 
def opt = cli.parse(args) 
if (!opt) { 
    //how to be in this case? seems I can never reach here 
    println "something went wrong, but I don't know what" 
} else if (opt.h) { 
    cli.usage() 
} else (!opt.s) { 
    println "missing required option -s, try with --help for more information" 
} else { 
    //do something 
} 

Если я вызываю мой сценарий с, например, -p, который не ошибочный параметр ничего не происходит. Аналогично, если я добавлю аргументы после опций, они также не обнаружены.

Как я могу обнаружить и сигнализировать об ошибке?

Кроме того, небольшое неудобство заключается в том, что в моем примере -s параметр является обязательным, так что в теории, я мог бы добавить required: true, на практике я не могу или не потребуются также с -h, но я думаю, что тестирование его if в порядке, если нет лучшего способа.

Моя настоящая проблема заключается в поиске нежелательных опций и аргументов. Любая помощь приветствуется, спасибо.

ОБНОВЛЕНИЕ: Спасибо @rodion за ваш ввод, я полагаю, что я соглашусь с достаточно хорошим, а не совершенным ради простоты. Вот что я придумал:

#!/usr/bin/groovy 
def cli = new CliBuilder(usage: 'cliTest -s sdkdir {projectName}', 
         header: 'Command line parameter parsing test in Groovy') 
cli.s longOpt: 'sdkdir', args: 1, 'sdkdir usage info, REQUIRED' 
cli.h longOpt: 'help', 'print usage information' 
def opt = cli.parse(args) 
def errMsg = "Invalid arguments.\nusage: ${cli.usage}\n" + 
     "Try `cliTest --help' for more information." 
if (!opt) { 
    //should never happen, since I don't have required parameters in CliBuilder 
    println "error processing arguments\n" 
} else if (opt.h) { 
    cli.usage() 
} else if (!opt.s) { 
    println errMsg 
} else if (opt.arguments().size() != 1) { 
    println errMsg 
} else { 
    println "Creating project ${opt.arguments()[0]}, sdkdir ${opt.s.value}" 
} 

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

$ ./cliTest 
Invalid arguments. 
usage: cliTest -s sdkdir {projectName} 
Try `cliTest --help' for more information. 

$ ./cliTest -a 
Invalid arguments. 
usage: cliTest -s sdkdir {projectName} 
Try `cliTest --help' for more information. 

$ ./cliTest -a -s ../sdkdir 
Invalid arguments. 
usage: cliTest -s sdkdir {projectName} 
Try `cliTest --help' for more information. 

$ ./cliTest -s ../sdkdir 
Invalid arguments. 
usage: cliTest -s sdkdir {projectName} 
Try `cliTest --help' for more information. 

$ ./cliTest -s ../sdkdir projectName 
Creating project projectName, sdkdir ../sdkdir 

$ ./cliTest -s ../sdkdir projectName wrong 
Invalid arguments. 
usage: cliTest -s sdkdir {projectName} 
Try `cliTest --help' for more information. 

$ ./cliTest -s ../sdkdir -a projectName 
Invalid arguments. 
usage: cliTest -s sdkdir {projectName} 
Try `cliTest --help' for more information. 

$ ./cliTest -s 
error: Missing argument for option: s 
usage: cliTest -s sdkdir {projectName} 
Command line parameter parsing test in Groovy 
-h,--help   print usage information 
-s,--sdkdir <arg> sdkdir usage info, REQUIRED 
error processing arguments 

Для моих целей, я более чем доволен, но если кто-то знает лучше, дайте мне знать.

Кроме того, я выяснил, что случай !opt может случиться, когда есть опция required: true, и аргумент отсутствует, но, по моему мнению, он никогда не будет использоваться, поскольку в противном случае невозможно иметь параметр справки.

ответ

2

Это похоже на this issue. Очевидно, вы можете проверить opt после синтаксического анализа (но если он равен нулю, то, я думаю, вы ничего не оставили). О, и проблема в этом случае Not A Bug, hmm ... wierd.

+0

ок, спасибо, что можно сделать. Как говорит репортер, это следует упомянуть в документах, но я тоже этого не видел. случай '! opt' может произойти, когда есть опция' required: true', и аргумент отсутствует, но я никогда не попрошу CliBuilder управлять требуемыми аргументами, так как тогда невозможно иметь автономный параметр, например '-h' для справки или '-v' для версии. – stivlo

9

Установите свойство groovy CliBuilder stopAtNonOption на значение false. (По умолчанию оно равно true). Я знаю, что это кажется неинтуитивным.

CliBuilder cli = new CliBuilder(usage:'script-name',stopAtNonOption:false) 

Тогда при запуске приложения из командной строки, то CliBuilder завершится с сообщением об ошибке, как только он встречает неопознанный вариант, например .:

$ script-name -bad 
error: Unrecognized option: -bad 
+0

Спасибо. Это было решение, которое я искал. – pveentjer

+0

Знаете ли вы, может ли он отображать все недопустимые аргументы, а не только первый, который он видит? – Sufendy