2015-05-14 59 views
1

我使用commander.js来解析命令行参数,我试图收集可以出现多次的可选参数,它总是返回我设置的选项加上默认一个。Commander.js收集多个选项总是包括默认

function collect (val, memo) { 
    memo.push(val); 
    return memo; 
} 

program 
    .command('run <param>') 
    .action(function run(param, options) { 
     console.log(param); 
     console.log(options.parent.config); 
    }); 

program 
    .option('-c, --config <path>', 'Config', collect, ["/path/to/default"]) 
    .parse(process.argv); 

当我打电话这样index.js run some -c "/some/path" -c "/other/path"脚本它打印[ '/path/to/default', '/some/path', '/other/path' ] ,它应该只打印['/some/path', '/other/path' ]

,当我把它叫做没有它工作正常使用-c PARAM,印刷用默认值的阵列。

我该如何解决这个问题?

回答

1

commander“重复值”选项不支持默认值,至少在使您不必编写自己的逻辑来处理,其中用户通过一个或多个值的情况的一种方式。 你写代码的方式,你得检查program.config属性的大小:

  • 如果用户通过一个或多个-c选项值,大小为> 1;
  • 否则,它是=== 1

IMO,这个方案要求“A名单”选项,它支持的默认值,并为您节省一些额外的工作。像:

program 
    .option('-l, --list <items>', 'A list', list, [ "/path/to/default" ]) 
    .parse(process.argv); 

要访问传递的值,只需拨打program.list,并在命令行中,其值叫它:

$ index.js run some -l "/some/path","/other/path" 
// where console.log(program.list) prints [ "/some/path", "/other/path" ] 

或者说,没有价值观:

$ index.js run some 
// where console.log(program.list) prints [ "/path/to/default" ]