2011-04-27 6 views
6

Estoy tratando de usar el maravilloso CliBuilder para analizar las opciones de línea de comandos. Estoy tratando de usar múltiples opciones largas sin una opción corta. Tengo el siguiente procesador:Groovy CliBuilder: solo se tomó LongOpt en la cuenta

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) 
    } 

De acuerdo con la documentación maravilloso que debería ser capaz de utilizar múltiples "_" valores para una opción cuando lo quiero ignorar el nombre de la opción corta y utilizar un nombre de la opción única . De acuerdo con la documentación maravilloso:

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 

nombres, los nombres cortos son a menudo uno caracteres de tamaño. Las opciones de un carácter con argumentos no requieren un espacio entre la opción y el argumento , p. Ej. -Ddebug = verdadero. El ejemplo también muestra el uso de '_' cuando no es aplicable una opción corta.

También tenga en cuenta que '_' se utilizó varias veces. Esto es compatible pero si se repite cualquier otro shortOpt o cualquier longOpt, entonces el comportamiento no está definido.

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

Cuando utilizo el "_" Sólo acepta el último en la lista (la última se encontró). ¿Estoy haciendo algo mal o hay una forma de solucionar este problema?

Gracias.

Respuesta

2

Me enteré de que mi código original funciona correctamente. Lo que no funciona es la función que toma todas las opciones construidas en el gabinete with e imprime un uso detallado. La llamada a la función integrada en CliBuilder que imprime el uso es:

cli.usage()

el código original anterior imprime la siguiente línea de uso:

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) 

Esta línea de uso hace que parezca como si estuviera opciones que faltan . Cometí el error de no imprimir cada elemento individual por separado de esta llamada de función de uso. Eso es lo que hizo que pareciera que solo le importaba el último artículo _ en el gabinete with. He añadido este código para demostrar que estaba pasando valores:

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

También descubrí que debe utilizar = entre una opción larga y es valor o no va a analizar las opciones de línea de comandos correctamente (--long-option=some_value)

3

no estoy seguro de lo que quiere decir que solo acepta la última. pero esto debería funcionar ...

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' 
+0

fyi, tu segunda excepción falla cuando pruebo este código. Tuve que agregar un '=' entre los argumentos largos en su llamada a la función de análisis: 'parse" -x param --dir-beans = beans --dir-orm = orm ".split ('')'. Supongo que los argumentos requieren el signo igual. – jmq

+0

@jmquigley no tengo ese problema. tal vez debería haber empezado a preguntar qué versión estás usando, ya que podría ser un viejo error (estoy en 1.8) – jpertino

Cuestiones relacionadas