Groovy CliBuilder:只考虑最后的LongOpt

时间:2011-04-27 02:56:58

标签: groovy

我正在尝试使用groovy CliBuilder来解析命令行选项。我正在尝试使用多个长选项,而不是一个简短的选项。 我有以下处理器:

    def cli = new CliBuilder(usage: 'Generate.groovy [options]')
    cli.with {
        h longOpt: "help", "Usage information"
        r longOpt: "root", args: 1, type: GString, "Root directory for code generation"
        x args: 1, type: GString, "Type of processor (all, schema, beans, docs)"
        _ longOpt: "dir-beans", args: 1, argName: "directory", type: GString, "Custom location for grails bean classes"
        _ longOpt: "dir-orm", args: 1, argName: "directory", type: GString, "Custom location for grails domain classes"
    }
    options = cli.parse(args)

    println "BEANS=${options.'dir-beans'}"
    println "ORM=${options.'dir-orm'}"

    if (options.h || options == null) {
        cli.usage()
        System.exit(0)
    }

根据groovy文档,当我希望它忽略短选项名称并仅使用长选项名称时,我应该能够为选项使用多个“_”值。根据groovy文档:

Another example showing long options (partial emulation of arg 
processing for 'curl' command line):
 def cli = new CliBuilder(usage:'curl [options] <url>')
 cli._(longOpt:'basic', 'Use HTTP Basic Authentication')
 cli.d(longOpt:'data', args:1, argName:'data', 'HTTP POST data')
 cli.G(longOpt:'get', 'Send the -d data with a HTTP GET')
 cli.q('If used as the first parameter disables .curlrc')
 cli._(longOpt:'url', args:1, argName:'URL', 'Set URL to work with')

 Which has the following usage message:

 usage: curl [options] <url>
     --basic         Use HTTP Basic Authentication
  -d,--data <data>   HTTP POST data
  -G,--get           Send the -d data with a HTTP GET
  -q                 If used as the first parameter disables .curlrc
     --url <URL>     Set URL to work with
This example shows a common convention. When mixing short and long
     

名称,短名称通常是一个   字符大小。一个角色   带参数的选项不需要   期权与期权之间的空间   论证,例如-DDEBUG = TRUE。该   示例还显示了使用'_'时   没有简短的选择适用。

     

另请注意,'_'被多次使用。这是支持但是   如果重复任何其他shortOpt或任何longOpt,则行为未定义。

http://groovy.codehaus.org/gapi/groovy/util/CliBuilder.html

当我使用“_”时,它只接受列表中的最后一个(遇到最后一个)。我做错了什么还是有办法解决这个问题?

感谢。

2 个答案:

答案 0 :(得分:3)

不确定你的意思它只接受最后一个。但这应该有用......

def cli = new CliBuilder().with {
  x 'something', args:1
  _ 'something', args:1, longOpt:'dir-beans'
  _ 'something', args:1, longOpt:'dir-orm'
  parse "-x param --dir-beans beans --dir-orm orm".split(' ')
}
assert cli.x == 'param'
assert cli.'dir-beans' == 'beans'
assert cli.'dir-orm' == 'orm'

答案 1 :(得分:2)

我了解到我的原始代码正常运行。什么不起作用的功能是采用with机箱中内置的所有选项并打印详细用法。 CliBuilder内置的函数调用打印用法是:

cli.usage()

上面的原始代码打印以下用法行:

usage: Generate.groovy [options]
    --dir-orm <directory>   Custom location for grails domain classes
 -h,--help                  Usage information
 -r,--root                  Root directory for code generation
 -x                         Type of processor (all, schema, beans, docs)

此使用行使我看起来像缺少选项。我犯了一个错误,就是不打印与此使用函数调用分开的每个单独的项目。这就是为什么它只关心_机箱中的最后一个with项目。我添加了这段代码来证明它传递了值:

    println "BEANS=${options.'dir-beans'}"
    println "ORM=${options.'dir-orm'}"

我还发现你必须在长选项和它的值之间使用=,否则它将无法正确解析命令行选项(--long-option=some_value