【问题标题】:Groovy CliBuilder, how to recognise wrong arguments?Groovy CliBuilder,如何识别错误的参数?
【发布时间】:2012-03-04 05:50:09
【问题描述】:

我正在学习 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 选项并且参数丢失时发生,但据我了解,它永远不能使用,因为否则不可能有帮助选项一个人。

【问题讨论】:

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


    【解决方案1】:

    这似乎与this issue 有关。显然你可以在解析后检查opt(但如果它为空,那么我猜你一无所有)。哦,问题显然是不是错误,嗯……很奇怪。

    【讨论】:

    • 好的,谢谢,可以。正如记者所说,应该在文档中提到,但我也没有看到。 !opt 的情况可能会在有 required: true 选项并且参数丢失时发生,但我永远不会要求 CliBuilder 管理所需的参数,因为那时不可能有像 -h 这样的独立选项来寻求帮助或 @ 987654326@ 版本号。
    【解决方案2】:

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

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

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

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

    【讨论】:

    • 谢谢。这就是我正在寻找的解决方案。
    • 你知道它是否可以显示所有无效参数而不是只显示它看到的第一个参数吗?
    猜你喜欢
    • 2021-05-28
    • 1970-01-01
    • 1970-01-01
    • 2013-06-13
    • 2022-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-25
    相关资源
    最近更新 更多