2

我找不到正确配置位置参数的方法。我有这个代码:

#!/usr/bin/env node

const create = (argv) => {
  console.log('create component with name:', argv.name)
}

const createBuilder = (yargs) => {
  yargs.positional('name', {
    desc: 'Name of the new component',
  })
}

/* eslint-disable no-unused-expressions */
require('yargs')
  .command({
    command: 'create <name>',
    desc: 'Create a new component',
    builder: createBuilder,
    handler: create,
  })
  .demandCommand(1, 'A command is required')
  .help()
  .argv

并且我想提供一条自定义错误消息,以防用户在创建命令后没有指定名称。

从文档中我不清楚如何做到这一点,在浏览 github 问题时,我遇到了这个评论(#928):

我建议改为使用 demandCommand 和 demandOption (每个都有文档)。

这些允许您分别配置位置参数和标志参数

我尝试了各种组合

.demandCommand(1, 'You need to provide name for the new component')

或者

.demandOption('name', 'You need to provide name for the new component')

但没有运气。有人知道怎么做这个吗?

4

2 回答 2

2

tl;dr - 尝试通过添加字符串*$0命令名称的开头使您的命令成为默认命令。

我发现只有在默认命令中定义了位置参数时,才尊重位置参数(即:显示在帮助菜单中并在未提供所需位置时抛出错误) 。

这是一个让它与您的代码一起使用的示例(请注意,您不再需要使用.demandCommand()):

require('yargs')
  .scriptName('cli-app')
  .command({
    command: '$0 create <name>',
    desc: 'Create a new component',
    builder: yargs => {
      yargs.positional('name', {
        desc: 'Name of the new component'
      });
    },
    handler: function(argv) {
      console.log('this is the handler function!');
    }
  })
  .help().argv;

输出(注意最后的“没有足够的非选项参数:得到 1,需要至少 2”行):

➞ node cli-app.js create                                                                                                                                       1 ↵
cli-app create <name>

Create a new component

Positionals:
  name  Name of the new component

Options:
  --version  Show version number                                       [boolean]
  --help     Show help                                                 [boolean]

Not enough non-option arguments: got 1, need at least 2
于 2019-10-29T11:18:42.643 回答
0

yargs的命令选项可以采用两种类型的参数。

第一个是强制性的:<varName>。如果由于某种原因,用户在没有输入 a 的情况下键入了命令varName,那么它将运行帮助页面。

第二个是可选的:[varName]。如果用户输入命令,即使缺少varName,命令也会运行。

额外:如果你想要无限varName变量,那么你可以为想要的选项提供一个扩展运算存在或<...varNames>[...varNames]


话虽如此,如果您想提供自定义错误消息,有几种方法可以解决。第一个是这个:

const program = require('yargs')
    .command('create [fileName]', 'your description', () => {}, argv => {
        if(argv.fileName === undefined) {
            console.error('You need to provide name for the new component')
            return;
        }
        console.log(`success, a component called ${argv.fileName} got created.`)
    })

Lodash 还提供了一个也可以工作的函数 _.isUndefined


第二个是这个:

const program = require('yargs')
    .command('create <fileName>', 'A description', () => {}, argv => {

    }).fail((msg, err, yargs) => {
        console.log('Sorry, no component name was given.')
    })

program.argv

有关更多信息,这里是 yargs api 的失败文档

于 2017-11-15T12:57:53.580 回答