首页 > 解决方案 > 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'
}

标签: node.jsnode-modulesyargs

解决方案


在您的代码中,您没有提供用户参数,

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.startand的值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 }));
    }
}

推荐阅读