如何创建通过未知选项的Groovy CliBuilder?

如何创建通过未知选项的Groovy CliBuilder?,groovy,Groovy,我有以下资料: final String scriptName = new File(getClass().protectionDomain.codeSource.location.path).getName() final cli = new CliBuilder( stopAtNonOption: false, usage: "${scriptName} ARGUMENTS", width: 80) cli.with { _ longO

我有以下资料:

final String scriptName = new File(getClass().protectionDomain.codeSource.location.path).getName()
final cli = new CliBuilder(
        stopAtNonOption: false,
        usage: "${scriptName} ARGUMENTS",
        width: 80)
cli.with {
    _ longOpt: "known-option-0", args: 1, argName: "KNOWN_OPTION_0", "Known option."
    _ longOpt: "known-option-1", args: 1, argName: "KNOWN_OPTION_1", "Known option."
}
我希望能够将其称为:

options = cli.parse(['--known-option-0=0', '--unknown-option=aoeu', '--known-option-1=1'])
这样就不会出现解析错误,而不必向接受的选项列表中添加--unknown选项,并且同时设置known-option-0和known-option-1

如果我设置:

        stopAtNonOption: true,
不会发出错误,但:

options.'known-option-0' == 0
options.'known-option-1' == false
如何解析所有已知选项并忽略未知选项?

class-CliParser{
class CliParser {
    final CliBuilder cli
    final List<Cli> options_list = []
    final List<String> arguments_list = []

    CliParser(CliBuilder cli) {
        this.cli = cli
    }

    Collection getOptions() {
        cli.options.getOptions()
    }

    Cli parse(List<String> args) {
        while (args.size() != 0) {
            groovy.util.OptionAccessor options = cli.parse(args)
            options_list.add(options)

            List<String> arguments = options.arguments()
            arguments_list.add(arguments[0])

            args = (arguments.size() > 1) ? arguments[1..-1] : []
        }

        return new Cli(options: options_list, arguments: arguments_list)
    }
}

class Cli {
    List<groovy.util.OptionAccessor> options
    List<String> arguments

    List<String> arguments() {
        arguments
    }

    List<Option> getOptions() {
        options.collect {
            it.getOptions()
        }
    }

    Object getProperty(String name) {
        final optionAccessor = options
                .find {
                    it.hasOption(name)
                }

        optionAccessor?.getProperty(name)
    }
}

final String scriptName = new File(getClass().protectionDomain.codeSource.location.path).getName()
final cliBuilder = new CliBuilder(
        stopAtNonOption: false,
        usage: "${scriptName} ARGUMENTS",
        width: 80)
cliBuilder.with {
    _ longOpt: "known-option-0", args: 1, argName: "KNOWN_OPTION_0", "Known option."
    _ longOpt: "known-option-1", args: 1, argName: "KNOWN_OPTION_1", "Known option."
}

final cliParser = new CliParser(cliBuilder)
final cli = cliParser.parse(args)
最终CliBuilder cli 最终列表选项\u List=[] 最终列表参数\u List=[] CliParser(CliBuilder cli){ this.cli=cli } 集合getOptions(){ cli.options.getOptions() } Cli解析(列表参数){ while(args.size()!=0){ groovy.util.OptionAccessor options=cli.parse(args) 选项列表。添加(选项) 列表参数=选项。参数() 参数列表。添加(参数[0]) 参数=(arguments.size()>1)?参数[1..-1]:[] } 返回新Cli(选项:选项列表,参数:参数列表) } } 类Cli{ 列出选项 列表参数 列表参数(){ 论据 } 列表getOptions(){ 选项。收集{ it.getOptions() } } 对象getProperty(字符串名称){ 最终选项Accessor=选项 .找到{ it.haspoption(名称) } optionAccessor?.getProperty(名称) } } 最终字符串scriptName=新文件(getClass().protectionDomain.codeSource.location.path).getName() 最终cliBuilder=新cliBuilder( stopAtNonOption:false, 用法:“${scriptName}参数”, 宽度:80) cliBuilder.with{ _longOpt:“已知选项-0”,args:1,argName:“已知选项0”,“已知选项。” _longOpt:“已知选项1”,args:1,argName:“已知选项1”,“已知选项” } 最终cliParser=新的cliParser(cliBuilder) final cli=cliParser.parse(args)
类语法分析器{
最终CliBuilder cli
最终列表选项\u List=[]
最终列表参数\u List=[]
CliParser(CliBuilder cli){
this.cli=cli
}
集合getOptions(){
cli.options.getOptions()
}
Cli解析(列表参数){
while(args.size()!=0){
groovy.util.OptionAccessor options=cli.parse(args)
选项列表。添加(选项)
列表参数=选项。参数()
参数列表。添加(参数[0])
参数=(arguments.size()>1)?参数[1..-1]:[]
}
返回新Cli(选项:选项列表,参数:参数列表)
}
}
类Cli{
列出选项
列表参数
列表参数(){
论据
}
列表getOptions(){
选项。收集{
it.getOptions()
}
}
对象getProperty(字符串名称){
最终选项Accessor=选项
.找到{
it.haspoption(名称)
}
optionAccessor?.getProperty(名称)
}
}
最终字符串scriptName=新文件(getClass().protectionDomain.codeSource.location.path).getName()
最终cliBuilder=新cliBuilder(
stopAtNonOption:false,
用法:“${scriptName}参数”,
宽度:80)
cliBuilder.with{
_longOpt:“已知选项-0”,args:1,argName:“已知选项0”,“已知选项。”
_longOpt:“已知选项1”,args:1,argName:“已知选项1”,“已知选项”
}
最终cliParser=新的cliParser(cliBuilder)
final cli=cliParser.parse(args)