Ярги требуют одного из вариантов застройщика - PullRequest
0 голосов
/ 14 февраля 2019

Как сделать так, чтобы одна из моих опций потребовалась от объекта-строителя из команды

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 или first для read команды

Также при запуске этой команды с недопустимыми параметрами не отображаются ошибки

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

yargs: ^12.0.5

Ответы [ 2 ]

0 голосов
/ 04 марта 2019

Это решение, которое я сейчас использую.Хотя я ищу лучшее решение. Команда

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 варианта.Команда, описание, строитель и обработчик.Строитель может быть объектом или функцией.Использование функции может использоваться для предоставления расширенной справки для конкретной команды.

Также я удалил запрос на оба из них, так как при использовании запроса он будет запрашивать оба варианта, но мне нужен был только один.

Также при настройкеОпция для строки или логического значения того, что он делает, приводит только к тому типу, который не проверяет тип.Так что здесь, если никакая опция не предоставлена ​​argv.first значение по умолчанию будет false & argv.id значение по умолчанию будет '' пустая строка.

Также при вызове функции Ошибка из проверки фактически отображается сообщение об ошибкеобъекта Error, но если мы вернем false, он отобразит тело функции в консоли в виде сообщения, помогающего отследить ошибку.

Также без доступа к argv yargs не будет анализироваться.

см. https://yargs.js.org/docs/#api-commandcmd-desc-builder-handler, https://yargs.js.org/docs/#api-argv.

0 голосов
/ 25 февраля 2019

Вы можете использовать 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 может быть строковым или логическим для значений параметров

...