我正在学习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
是好的,除非有更好的方法。
我真正的问题是关于寻找不需要的选项和参数。任何帮助表示感谢,谢谢。
UPDATE:感谢@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
选项并且缺少参数时,但根据我的理解,它永远不会被使用,因为否则无法单独提供帮助选项。
好的,谢谢,是可以做到的。正如记者所说,应该在文档中提到,但我没有看到它。如果有'required:true'选项并且缺少参数,'!opt'的情况就会发生,但我绝不会要求CliBuilder管理所需的参数,因为不可能有像'-h'这样的独立选项寻求帮助或'-v'版本。 – stivlo 2012-02-13 03:05:44