node.js - yargs 没有收到任何参数
问题描述
我正在尝试使用带有参数的 yargs 编写一个子命令,并按照文档进行操作。但是,命令本身的行为就像它不接收任何参数一样,而只是使用默认值。
主.js:
require('yargs')()
.commandDir(path.join(core.ROOT, 'cmds'), { extensions: ['cmd.js'], recurse: true })
.wrap(null)
.help()
.alias('help', 'h')
.version(false)
.parse();
命令.cmd.js:
module.exports = {
command: 'my-command',
desc: `Does something`,
builder: {
date: { type: 'string', alias: 'd', default: '' },
start: { type: 'string', alias: 's', default: '' },
end: { type: 'string', alias: 'e', default: '' },
},
async handler(argv) {
console.log(require('util').inspect(argv, { depth: null }));
...
}
的输出argv
是:
_: [ 'my-command', '2021-01-01', '2021-12-31' ],
env: 'dev',
date: '',
d: '',
start: '',
s: '',
end: '',
e: '',
'$0': 'src/main.js'
}
解决方案
在您的代码中,您没有提供用户参数,
require('yargs')()
.parse();
您可能想要提供process.argv.slice(2)
. 像这样:
require('yargs')(process.argv.slice(2))
...
.parse();
不确定您如何能够验证 argv,但使用您提供的代码,它应该始终只给出:
{ _: [], '$0': 'some_string' }
因此,也许您确实提供了参数,只是忘记在示例代码中显示它。
argv 输出将日期作为位置参数:
{ _: [ 'my-command', '2021-01-01', '2021-12-31' ], ... }
似乎您正试图将这些位置参数作为argv.start
and的值argv.end
。但是您并没有告诉 yargs 如何解释位置参数。
它应该看起来像这样:
module.exports = {
command: 'my-command [start] [end]',
desc: `Does something`,
builder: y => {
return y.positional("start", {
type: "string",
alias: "s",
default: ""
});
},
async handler(argv) {
console.log(require('util').inspect(argv, { depth: null }));
}
}