Yargs - 如何为省略的位置参数

时间:2017-11-15 10:00:39

标签: node.js command-line-interface yargs

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

#!/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

如果用户在create命令后没有指定名称,我想提供自定义错误消息。

我从文档中不清楚如何做到这一点,并且在经历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')

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

2 个答案:

答案 0 :(得分:1)

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

我发现,当在default command中定义位置参数时,仅会尊重位置参数(即:显示在帮助菜单中,并且在未提供所需位置时抛出错误)。

下面是使它与代码一起使用的示例(请注意,您不再需要使用.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

答案 1 :(得分:0)

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

第一个是强制性<varName>。如果由于某种原因,用户在不输入varName的情况下键入命令,则会运行帮助页面。

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

额外:如果您想要无限varName个变量,那么您可以为想要的选项提供spread operator。成为<...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还提供function _.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上的fail documentation