Commander.js收集多个选项始终包含默认值

时间:2015-05-14 13:29:56

标签: node.js node-commander

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

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 个答案:

答案 0 :(得分:3)

commander “可重复值”选项不支持默认值,至少以某种方式阻止您必须编写自己的逻辑来处理用户传递一个或多个值。 您编写代码的方式,您将需要检查program.config属性的大小:

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

IMO,此方案需要“A list”选项,该选项支持默认值,并为您节省一些额外的工作。像:

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" ]