Groovy CliBuilder,如何识别错误的参数?

时间:2012-02-12 15:54:01

标签: groovy command-line-interface command-line-arguments command-line-parsing

我正在学习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,实际上我不能或者也需要{ {1}},但我认为使用-h进行测试很好,除非有更好的方法。

我真正的问题是找到不需要的选项和参数。感谢任何帮助,谢谢。

更新:感谢@rodion的输入,我想我会为了简单而善于解决而不是完美。以下是我提出的建议:

if

此解决方案已经足够好了,但并不完美,因为它不会告诉您哪个参数有误,只是简单地告诉您消息或打印使用信息。以下是一些测试:

#!/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情况会发生,但根据我的理解,它永远不会被使用,因为否则不可能单独有一个帮助选项。

2 个答案:

答案 0 :(得分:9)

将groovy CliBuilder属性stopAtNonOption设置为false。 (默认为true)。我知道这似乎不直观。

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

然后,当您运行命令行应用程序时,CliBuilder会在遇到无法识别的选项时立即退出并显示错误消息,例如:

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

答案 1 :(得分:2)

这似乎与this issue有关。显然你可以在解析之后检查opt(但是如果它是null,那么我猜你没有任何东西)。哦,这个问题显然是 Not A Bug ,嗯......很奇怪。