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

相關問題