yargs 不接收任何参数

问题描述

我正在尝试使用 yargs 编写一个子命令,该子命令接受一个参数,并严格按照文档进行操作。但是,该命令本身的行为就像它不接收任何参数一样,而只是使用认值。

main.js:

require('yargs')()
    .commandDir(path.join(core.ROOT,'cmds'),{ extensions: ['cmd.js'],recurse: true })
    .wrap(null)
    .help()
    .alias('help','h')
    .version(false)
    .parse();

command.cmd.js:

module.exports = {
    command: 'my-command',desc: `Does something`,builder: {
        date: { type: 'string',alias: 'd',default: '' },start: { type: 'string',alias: 's',end: { type: 'string',alias: 'e',},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.startargv.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 }));
    }
}