yargs要求生成器选项之一

时间:2019-02-14 09:32:40

标签: node.js npm yargs

如何从命令的构建器对象中获取我的选项之一

require('yargs')
  .usage('Usage: $0 <cmd> [options]')
  .command(
    'read',
    'Read a note',
    {
      id: {
        demand: true,
        string: true
      },
      first: {
        demand: true,
        boolean: true
      }
    },
    argv => {
      note.read(argv.id).then(data => {
        console.log('==================note read==================');
        console.log(data);
        console.log('==================note read==================');
      });
    }
  )
  .help()
  .strict().argv;

在这里,我希望用户为id命令传递firstread选项

在使用无效选项运行此命令时,也不会显示错误

node app.js read --id=1 --first=1

yargs: ^12.0.5

3 个答案:

答案 0 :(得分:1)

您可以使用check API。

// code is written for logic purpose. Not tested.
.check(function (argv) {
        if ((argv.id && !argv.first) || (!argv.id && argv.first)) {
           return true;
        } else if (argv.id && argv.first) {
           throw(new Error('Error: pass either id or first option for read command'));
        } else {
           throw(new Error('Error: pass either id or first option for read command'));
        }
    })

PS:1可以是字符串或布尔值作为选项值

答案 1 :(得分:0)

这是我当前正在使用的解决方案。尽管我正在寻找更好的解决方案。

require('yargs')
  .usage('Usage: $0 <cmd> [options]')
  .command(
    'read',
    'Read a note',
    yargs =>
      yargs
        .option('id', {
          string: true
        })
        .option('first', {
          boolean: true
        })
        .check(({ id, first }) => {
          if (!id.trim() && !first) {
            throw new Error('id or first option is required');
          }

          return true
        }),
    argv => {
      if (argv.first) {
        note.readFirst().then(data => {
          console.log('==================note read==================');
          console.log(data);
          console.log('==================note read==================');
        });
      } else {
        note.read(argv.id).then(data => {
          console.log('==================note read==================');
          console.log(data);
          console.log('==================note read==================');
        });
      }      
    }
  )
  .help()
  .strict().argv;

yargs命令有4个选项。命令,描述,生成器和处理程序。 Builder可以是对象或函数。使用功能可用于提供高级命令特定帮助。

我也删除了对它们的需求,因为使用需求会询问两个选项,但我只想要一个。

此外,当将选项设置为字符串或布尔值时,它只会强制转换为该类型,而不会验证该类型。因此,这里如果没有提供任何选项,argv.first默认值为falseargv.id默认值为''空字符串。

此外,当从check函数中抛出错误时,它实际上会显示Error对象的错误消息,但是如果我们返回false,它将在控制台中将函数主体显示为消息,以帮助跟踪错误。

同样,如果不访问argv,yargs也将无法解析。

请参见https://yargs.js.org/docs/#api-commandcmd-desc-builder-handlerhttps://yargs.js.org/docs/#api-argv

答案 2 :(得分:0)

您可以使用demandOption = true解决问题