2014-12-12 3 views
2

Использование Groovy CliBuilder, в идеале я хотел бы иметь CMD строки следующим образом:CliBuilder аргумент без тире

./MyProgram.groovy CommandName -arg1 -arg2 -arg3 

ли можно разобрать вытащить CommandName в качестве аргумента, используя CliBuilder?

+2

Groovy использует apache-cli, поэтому у него может не быть такой возможности. См. Http://stackoverflow.com/questions/7739214/command-line-parser-and-lack-of-subcommand-and-grouping, если вы открыты для использования некоторых других библиотек (jcommander, args4j) – Jayan

+0

@Jayan Спасибо. Я хотел, чтобы скрипт исполнялся из CMD-линии OSX, используя '#!/Usr/bin/env groovy', поэтому я работал с CliBuilder. –

ответ

1

Это можно сделать, если вы установите для свойства stopAtNonOption значение false, чтобы синтаксический разбор не останавливался на CommandName. Затем вы можете получить команду от CliBuilderoptions. Ниже приведен крошечный пример:

def test(args) { 
    def cli = new CliBuilder(usage: 'testOptions.groovy [command] -r -u', stopAtNonOption: false) 
    cli.with { 
     r longOpt: 'reverse', 'Reverse command' 
     u longOpt: 'upper', 'Uppercase command' 
    } 

    def options = cli.parse(args) 
    def otherArguments = options.arguments() 
    def command = otherArguments ? otherArguments[0] : 'defaultCommand' 

    def result = command 
    if (options.r) { 
     result = result.reverse() 
    } 

    if (options.u) { 
     result = result.toUpperCase() 
    } 

    result 
} 

assert 'myCommand' == test(['myCommand']) 
assert 'MYCOMMAND' == test(['myCommand', '-u']) 
assert 'dnammoCym' == test(['myCommand', '-r']) 
assert 'DNAMMOCYM' == test(['myCommand', '-r', '-u']) 
assert 'defaultCommand' == test([])