4

我正在学习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选项并且缺少参数时,但根据我的理解,它永远不会被使用,因为否则无法单独提供帮助选项。

回答

2

这似乎与this issue有关。显然你可以在解析后检查opt(但是如果它是空的,那么我猜你没有任何东西)。噢,这个问题显而易见不是一个错误,嗯......奇怪。

+0

好的,谢谢,是可以做到的。正如记者所说,应该在文档中提到,但我没有看到它。如果有'required:true'选项并且缺少参数,'!​​opt'的情况就会发生,但我绝不会要求CliBuilder管理所需的参数,因为不可能有像'-h'这样的独立选项寻求帮助或'-v'版本。 – stivlo 2012-02-13 03:05:44

9

将groovy CliBuilder属性stopAtNonOption设置为false。 (默认为true)。我知道这看起来很不直观。

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

然后,当你运行你的命令行应用程序,该CliBuilder会出现错误消息,一旦退出,因为它遇到无法识别的选项,例如:

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

谢谢。这是我正在寻找的解决方案。 – pveentjer 2014-04-17 16:08:24

+0

你知道它是否可以显示所有无效的参数,而不是它看到的第一个参数? – Sufendy 2015-06-02 01:23:13