我正在學習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