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