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 и аргумент отсутствует, но, насколько я понимаю, ее никогда нельзя использовать, так как в противном случае невозможно иметь только опцию справки.


person stivlo    schedule 12.02.2012    source источник


Ответы (2)


Похоже, это связано с этой проблемой. По-видимому, вы можете проверить opt после разбора (но если он нулевой, то, я думаю, вы остались ни с чем). О, и проблема, по-видимому, не ошибка, хм... странно.

person rodion    schedule 12.02.2012
comment
ок, спасибо, можно. Как говорит репортер, это должно быть указано в документах, но я тоже не видел. случай !opt может случиться, когда есть опция required: true и аргумент отсутствует, но я никогда не буду просить CliBuilder управлять необходимыми аргументами, поскольку тогда невозможно иметь автономную опцию, такую ​​​​как -h для справки или -v для версии. - person stivlo; 13.02.2012

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

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

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

$ script-name -bad
error: Unrecognized option: -bad
person Duncan    schedule 08.12.2013
comment
Спасибо. Это было решение, которое я искал. - person pveentjer; 17.04.2014
comment
Знаете ли вы, может ли он отображать все недопустимые аргументы, а не только первый, который он видит? - person Sufendy; 02.06.2015