3

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

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;

在这里,我希望用户通过命令idfirst选项read

此外,当使用无效选项运行此命令时,它不会显示错误

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

yargs: ^12.0.5

4

3 回答 3

4

您可以使用checkAPI。

// 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 可以是选项值的字符串或布尔值

于 2019-02-25T14:54:29.877 回答
1

你可以demandOption = true用来解决问题

于 2020-04-02T12:23:01.083 回答
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默认值将是false&argv.id默认值将是''空字符串。

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

同样不访问argvyargs 也不会解析。

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

于 2019-03-04T19:57:41.747 回答