командир пишет инструменты командной строки Node (cli)

Node.js

инструменты cli доступны везде,

Например, vue-cli:

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

принцип:

Когда программа Nodejs запускается,processОдин из объектов называетсяargvхарактеристики.命令行程序的第一个重头戏就是解析这个process.argvАтрибуты.

Определите сценарий приветствия и напечатайте process.argv.

#!/usr/bin/env node
console.log('hello ', process.argv);
在终端输入$ hello a b c

выглядитprocess.argvКажется, это массив, где первый элемент — путь выполнения узла, второй элемент — путь текущего исполняемого файла, начиная с третьего элемента, — параметр, вносимый во время выполнения.

Конечно, вы можете самостоятельно проанализировать параметр argv.

используя командующий.js

commander.jsдаTJИнструментарий, написанный для упрощения создания программ командной строки узла.

установка и использование

Установка проста,

$ npm install commander

// file: ./bisheng
#!/usr/bin/env node
const program = require('commander');
const package = require('../package.json');
program
  .version(package.version)
  .option('-f, --foo', 'enable some foo')  
  .option('-b, --bar', 'enable some bar')  
  .option('-B, --baz', 'enable some baz');

  program.on('--help', function(){  
   console.log('');  
   console.log('Examples:');  
   console.log('  $ custom-help --help');
   console.log('  $ custom-help -h');
  });

  program.parse(process.argv);

命令来执行它$ ./bisheng -h


Первым преимуществом command.js является то, что он предоставляет краткий API для разбора опций и параметров. Второе преимущество — автоматическая генерация справочных текстовых сообщений.

Общие API

  • version

Функция: определение номера версии командной программы Пример использования: .version('0.0.1', '-v, --version') Разрешение параметра:
  1. Номер версии первого параметра
  2. Пользовательский флаг второго параметра : по умолчанию -V и --version

когда мы входим./bisheng -v или./bisheng --version может вывести соответствующий номер версии

  • option

Роль: используется для определения параметров команды:.option('-n, --name  <name>', 'your name', 'GK')

  1. Первый параметр Custom logo : разделить на длинные и короткие логотипы, разделенные запятыми, вертикальными чертами или пробелами; .
    1. За флагом могут следовать параметры, которые можно изменить с помощью или [], первое означает обязательные параметры, последнее означает необязательные параметры.
  2. Описание опции второго параметра : отображать описание флага при использовании команды --help
  3. Третий параметр Option значение параметра по умолчанию, необязательный.

Выполните команду $ ./bisheng --name 123

program.name值为123 不输入123则取默认值GK
  • command

Роль: добавить имя команды Пример использования: .command('rmdir[otherDirs...]', 'install description', opts)

Разбор параметров:

  1. Первый параметр Имя команды : За командой могут следовать параметры, заключенные в или []; последний параметр команды может быть переменной, а флаг otherDirs... добавляется после массива, как в примере ; параметры, переданные после команды, будут переданы функции обратного вызова действия и массиву program.args
  2. Второй параметр Описание команды : Если он существует, а действие(fn) не отображается, будет запущена подкомандная программа, иначе будет сообщено об ошибке
      • Когда второго параметра нет, command.js вернетCommandObject, если есть второй параметр, будет возвращен объект-прототип.
      • При вызове со вторым параметром и без отображенияaction(fn), будет использоваться режим подкоманды.
      • Так называемый режим подкоманды,./pm,./pm-install,./pm-searchЖдать. Эти подкоманды находятся в отдельных файлах от основной команды.
3. Опции конфигурации : noHelp, isDefault и т.д. можно настроить


  • alias

Роль: использование пользовательского псевдонима .alias('ex')


  • description

Роль: определите описание команды Пример использования: .description('rmdir desc')


  • action

Применение:.action(fn)

Используется для установки соответствующего обратного вызова для выполнения команды.fnПараметры, которые могут принимать команды, являются функциональными параметрами в том же порядке, что иcommand()определяются в том же порядке.


parse

Применение:program.parse(process.argv)

Это апи вообще последний звонок для парсингаprocess.argv.


outputHelp

Применение:program.outputHelp()

Обычно используется для автоматической печати справочной информации, когда параметры не введены.


разбор параметров

.option()Методы используются для определения командира с параметрами, а также служат документацией для этих параметров. Следующий пример будет анализировать изprocess.argvУказанные параметры и опции, параметры, не соответствующие ни одной из опций, будут помещены вprogram.argsв массиве.

#!/usr/bin/env node

var program = require('commander');

program
  .version('0.0.1')
  .option('-p, --peppers', 'Add peppers')
  .option('-P, --pineapple', 'Add pineapple')
  .option('-b, --bbq-sauce', 'Add bbq sauce')
  .option('-c, --cheese [type]', 'Add the specified type of cheese [marble]', 'marble')
  .parse(process.argv);

console.log('you ordered a pizza with:');
if (program.peppers) console.log('  - peppers');
if (program.pineapple) console.log('  - pineapple');
if (program.bbqSauce) console.log('  - bbq');
console.log('  - %s cheese', program.cheese);

Выполните команду $ ./bisheng -p или ./bisheng --peppers

program.peppers的值为true


Выполните команду $ ./bisheng -c 123

program.cheese值为123 默认值为marble



Добавить функцию-обработчик

#!/usr/bin/env node
var program = require('commander');


function range(val) {
  return val.split('..').map(Number);
}

function list(val) {
  return val.split(',');
}

function collect(val, memo) {
  memo.push(val);
  return memo;
}

function increaseVerbosity(v, total) {
  return total + 1;
}

program
  .version('0.0.1')
  .usage('[options] <file ...>')
  .option('-i, --integer <n>', 'An integer argument', parseInt)
  .option('-f, --float <n>', 'A float argument', parseFloat)
  .option('-r, --range <a>..<b>', 'A range', range)
  .option('-l, --list <items>', 'A list', list)
  .option('-o, --optional [value]', 'An optional value')
  .option('-c, --collect [value]', 'A repeatable value', collect, [])
  .option('-v, --verbose', 'A value that can be increased', increaseVerbosity, 0)
  .parse(process.argv);

console.log(' int: %j', program.integer);
console.log(' float: %j', program.float);
console.log(' optional: %j', program.optional);
program.range = program.range || [];
console.log(' range: %j..%j', program.range[0], program.range[1]);
console.log(' list: %j', program.list);
console.log(' collect: %j', program.collect);
console.log(' verbosity: %j', program.verbose);
console.log(' args: %j', program.args);
См. соответствующие выходные результаты:


регулярное выражение

program
  .version('0.0.1')
  .option('-s --size <size>', 'Pizza size', /^(large|medium|small)$/i, 'medium')
  .option('-d --drink [drink]', 'Drink', /^(coke|pepsi|izze)$/i)
  .parse(process.argv);

console.log(' size: %j', program.size);
console.log(' drink: %j', program.drink);

переменный параметр

Последний параметр команды может быть переменным, и только последний параметр может быть переменным. Чтобы сделать параметр переменным, вам нужно добавить имя параметра.... Вот пример:

#!/usr/bin/env node

var program = require('commander');

program
  .version('0.0.1')
  .command('rmdir <dir> [otherDirs...]')
  .action(function (dir, otherDirs) {
    console.log('rmdir %s', dir);
    if (otherDirs) {
      otherDirs.forEach(function (oDir) {
        console.log('rmdir %s', oDir);
      });
    }
  });

program.parse(process.argv);
Выполнить $ ./bisheng rmdir dir Первомайский праздник и идти домой
rmdir <dir> [otherDirs...]
dir 接受参数dir otherDirs为一个数组接受后面所有的参数(可变参数)


Синтаксис для указания параметров

угловые скобки (например,<cmd>) представляет требуемый ввод, квадратные скобки (например,[env]) представляет необязательный ввод.

#!/usr/bin/env node

var program = require('commander');

program
  .version('0.0.1')
  .arguments('<cmd> [env]')
  .action(function (cmd, env) {
     cmdValue = cmd;
     envValue = env;
  });

program.parse(process.argv);

if (typeof cmdValue === 'undefined') {
   console.error('no command given!');
   process.exit(1);
}
console.log('command:', cmdValue);
console.log('environment:', envValue || "no environment given");


Подкоманды в стиле Git

// file: ./bin/bisheng
#!/usr/bin/env node
const program = require('commander');
const package = require('../package.json');
program  .version(package.version)
  .usage('[command] [options]')
  .command('start [options]', 'to start a server')
  .command('build [options]', 'to build and write static files to `config.output`')
  .command('gh-pages [options]', 'to deploy website to gh-pages',{isDefault: true})
  .parse(process.argv);

когда.command()С параметром описания его нельзя использовать.action(callback)для обработки подкоманды, иначе произойдет ошибка. Это сообщает командиру, что вы собираетесь взять отдельный исполняемый файл в качестве подкоманды. Командир попытается выполнить сценарий входа (например,./bin/bisheng) для поиска в каталогеprogram-commandисполняемый в видеbisheng-start, bisheng-build,bisheng-gh-pages.

следующим образом:


вы можете позвонить.command()при передаче опций. уточнитьopts.noHelpдляtrueЭта опция будет удалена из сгенерированного вывода справки. уточнитьopts.isDefaultдляtrueЭта подкоманда будет выполнена, если никакая другая подкоманда не указана.

Автоматизировать справочные сообщения --help

Справочная информация автоматически генерируется командиром на основе вашей программы.--helpСгенерированная справочная информация:


пользовательская справка

вы можете следить--helpКонтроль-h, --helpОтображение любой информации. После завершения вызова Commander автоматически закроется, и остальная часть вашей программы не будет отображаться. Например, в следующем «веще» не будет выполняться--helpвывод времени.

#!/usr/bin/env node
var program = require('commander');

program
  .version('0.0.1')
  .option('-f, --foo', 'enable some foo')
  .option('-b, --bar', 'enable some bar')
  .option('-B, --baz', 'enable some baz');

program.on('--help', function(){
  console.log('');
  console.log('Examples:');
  console.log('  $ custom-help --help');
  console.log('  $ custom-help -h');
});

program.parse(process.argv);

console.log('stuff');


.outputHelp(cb)

Не выходите для вывода справочной информации. Необязательный обратный вызов для обработки после отображения текста справки. Если вы хотите отобразить справку по умолчанию (например, если команда не указана), вы можете использовать что-то вроде:

var program = require('commander');
var colors = require('colors');

program
  .version('0.0.1')
  .command('getstream [url]', 'get stream URL')
  .parse(process.argv);

  if (!process.argv.slice(2).length) {
    program.outputHelp(make_red);
  }

function make_red(txt) {
  return colors.red(txt); // 在控制台上显示红色的帮助文本
}