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