我正在使用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