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



我正在使用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参数调用它时,它可以正常工作,用默认值打印数组。我该如何解决?

commander "可重复值" 选项不支持默认值用户通过一个或多个值的方案。您编写代码的方式,您将必须检查program.config属性的大小:

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

imo,此方案要求" 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" ]

您可以将通过的数组标记为默认选项,然后在收集时。

function collectRepeatable(value, previous) {
    if (previous._isDefault) {
        return [value];
    }
    previous.push(value);
    return previous;
}
function defaultRepeatable(array) {
    array._isDefault = true;
    return array;
}
//...
program
  //...
    .option('--exclude <file>', 'excludes files in input directory by file or pattern', 
        collectRepeatable, defaultRepeatable(['.gitignore', 'codeswing.json']))
  //...

我创建了包含完整示例的Replip空间:https://replit.com/@againpsychox/testing-commander-repeatable-options

相关内容

  • 没有找到相关文章

最新更新