Клайн И Создание Интерактивного Приложения Командной Строки

Как бы вы ни любили командную строку, вы согласитесь, что простой и удобный интерфейс консоли, поддержка истории, автозаполнение и простые команды очень впечатляют. Не вдаваясь в дискуссию о преимуществах и недостатках «тьмы», хотелось бы представить хабр-сообществу свою маленькую поделку из мира Node.js, основная задача которой — улучшить жизнь разработчика, решившего написать консольную утилиту.



Обзор Клайна

Cline — небольшая библиотека, основанная на Node. линия чтения модуль, поэтому у нас есть поддержка истории, автодополнение, опрос пользователей и с моей легкой руки дополнения в виде маски пароля, возможность прослушивания пользовательского ввода в виде отдельных команд, описанных как простые или регулярные выражения, вывод справки, упрощенная работа с историей, интерактивный режим.

При всем этом создать приложение, которое после запуска будет ждать ввода команды от пользователя, становится гораздо проще.



Пример

Для тех, кому нужно достаточно кода, чтобы понять возможности библиотеки, вот пример: Пример
  
  
  
  
  
  
  
  
  
  
  
   

var cli = require('cline')(); cli.command('start', 'starts program', function () { cli.password('Password:', function (str) { console.log(str); }) }); cli.command('stop', function () { cli.confirm('Sure?', function (ok) { if (ok) { console.log('done'); } }) }); cli.command('{string}', '', {string: '[A-Za-z]+'}); cli.command('{number}', '', {number: '\\d+'}); cli.on('command', function (input, cmd) { if ('start' !== cmd && 'stop' != cmd) { cli.prompt('More details on ' + cmd + ':'); } }); cli.history(['start', 'stop']); cli.interact('>'); cli.on('history', function (item) { console.log('New history item ' + item); }); cli.on('close', function () { console.log('History:' + cli.history()); process.exit(); });



Применение

Клайн использует в своей работе Интерфейс или что-то подобное.

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

var cli = require('cline')(myInterface);

Центральной особенностью cline является добавление команд.

cli.command(expression, description, parameters, callback);

выражение — это выражение, которое мы ожидаем от пользователя, может содержать динамические параметры, например kill {id}, здесь id — имя динамического параметра, я напомню об этом позже.

описание – дополнительное пояснение к команде, используемой для генерации справки.

параметры – объект, содержащий имена динамических параметров, упомянутых в выражениях, как ключи, и регулярных выражениях, как значения.

Например, {id: '\\d+'} – id будет означать любое число.

перезвонить – функция, которая будет вызываться, когда пользователь вводит строку, соответствующую выражению.

Вызывается с двумя аргументами: строкой от пользователя и объектом со значениями динамических параметров.



cli.command('kill {id}', 'kill task by id', {id: '\\d{1,3}'}, function (input, args) { console.log(input) // kill 12 console.log(args.id) // 12 });

Все параметры cli.command, кроме выражения, являются необязательными, и вы можете их пропустить по своему усмотрению.



cli.command(expression, description, callback); cli.command(expression, parameters, callback); cli.command(expression, description); cli.command(expression, parameters);

Все эти варианты абсолютно верны.



Взаимодействие с пользователем

От пользователя можно ожидать 3 вещей: 1.Ввод

cli.prompt('Your turn:');

2.Подтверждение

cli.confirm('Sure?', function (ok) {});

3.Пароль

cli.password('Password:', ‘*’, function (pass) {});

Вы также можете просто перейти в интерактивный режим

cli.interact('>');

В этом режиме библиотека ожидает ввода от пользователя и пытается интерпретировать каждую строку как команду, ищет совпадения в списке описанных команд и после выполнения функции прослушивателя по команде снова ожидает ввода.

Повторный вызов интерактивного режима просто изменит приглашение.



Системные команды, история и события

Без каких-либо дополнительных манипуляций при использовании cline доступны сразу 3 команды: прозрачный или - очищает экран помощь или \? – отображает сертификат Выход или \q - Выход С историей все просто, никаких файлов и потоков, просто заполняем историю так:

cli.history(['start', 'stop']);

порядок элементов соответствует давности, первый элемент в списке будет самым старым.

Ну, историю можно прочитать так:

cli.history();

мы получаем список.

Также вы можете подписаться на событие добавления элемента в историю.

Ну а дальше вам решать, как сохранить этот список.

Поскольку cline наследует EventEmitter, здесь широко используется событийная модель, вы можете подписаться на следующие события: закрывать — пользователь вызвал команду выхода или остановил процесс с помощью Ctrl+C история – при добавлении нового элемента в историю новый элемент передается слушателю в качестве параметра.

команда — пользовательский ввод соответствует одной из команд (кроме системных), строка от пользователя и выражение команды передаются в качестве параметра слушателю.



Окончательно

Если вы не хотите молчать, когда пользователь вводит что-то кроме описанных вами команд, сделайте так:

cli.command('*', function (input) { console.log(input + ' is not correct'); cli.usage(); });

Большое спасибо за внимание, надеюсь, cline вам пригодится или может даже вдохновит на написание собственной консольной утилиты или хотя бы ее форка.

github .

P.S. Особая благодарность UFO за приглашение.

Теги: #командная строка #readline #утилиты #утилиты #утилиты #утилиты #github #JavaScript #node.js

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.