対話型のコマンドラインアプリケーションの作成と作成

コマンドラインがどれほど愛されていても、シンプルで便利なコンソールインターフェース、履歴サポート、自動追加、シンプルなコマンドは非常に印象的であることを認めなければなりません。 「暗闇」の長所と短所について議論することなく、Node.jsの世界からの私の小さな技術を試用するためにHabraコミュニティに提出したいと思います。その主なタスクは、コンソールユーティリティを書くことにした開発者の生活を改善することです。

クラインレビュー


Clineはノードのreadlineモジュールに基づいた小さなライブラリです。そのため、履歴サポート、自動追加、ユーザーポーリング、そして簡単な手でパスワードマスクの形式で追加、ユーザー入力を簡単なコマンドとして個別のコマンドとしてリッスンする機能がありますまたは正規表現、ヘルプ出力、履歴を使用した作業の簡略化、インタラクティブモード。

これらすべてにより、起動後、ユーザーからのユーザー入力を待機するアプリケーションの作成が大幅に簡素化されます。



ライブラリの機能を理解するのに十分なコードを持っている人のために、ここに例があります:
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(); }); 



使用する


Clineは、その作業またはそれに類似したものでInterfaceを使用します。Interfaceの独自の実装がある場合は、パラメーターとして渡すことができます(テストサポート)。
 var cli = require('cline')(myInterface); 

clineの中心的な機能は、コマンドの追加です。
 cli.command(expression, description, parameters, callback); 

expressionはユーザーに期待する式です。たとえば、kill {id}などの動的パラメーターを含めることができます。ここでidは動的パラメーターの名前です。後で説明します。

description-ヘルプの生成に使用されるコマンドの追加説明。

parameters-キーとして式で記述され、値として正規表現で記述された動的パラメーターの名前を含むオブジェクト。 たとえば、{id: '\\ d +'}-idは任意の数字を意味します。

コールバックは、ユーザーが式に対応する文字列を入力したときに呼び出される関数です。 ユーザーからの文字列と動的パラメーターの値を持つオブジェクトの2つの引数で呼び出されます。
 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 }); 

expressionを除くすべての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つのコマンドをすぐに使用できます。
clearまたは\ c-画面をクリアします

ヘルプまたは\? -ヘルプを表示します

exitまたは\ q-終了

ファイルやストリームはなく、ストーリーはすべてシンプルで、次のようにストーリーを埋めます。
 cli.history(['start', 'stop']); 

要素の順序は制限に対応し、リストの最初の要素が最も古い要素になります。
さて、あなたはこのような物語を読むことができます:
 cli.history(); 

リストを取得します。 また、アイテムがストーリーに追加されるイベントにサブスクライブすることもできます。 それでは、このリストの保存方法を決定します。

clineはEventEmitterを継承するため、イベントモデルはここで広く使用されており、そのようなイベントをサブスクライブできます。
close-ユーザーがexitコマンドを呼び出したか、Ctrl + Cを使用してプロセスを停止しました

history-新しい要素を履歴に追加すると、新しい要素がパラメーターとしてリスナーに渡されます。

command-コマンドの 1つ(システムのコマンドを除く)からのユーザー入力が一致し、ユーザーからの行とコマンド式がパラメーターとしてリスナーに渡されます。

最後に


ユーザーが説明したコマンド以外の何かを入力したときに黙って静かになりたくない場合は、次のようにします。
 cli.command('*', function (input) { console.log(input + ' is not correct'); cli.usage(); }); 

ご静聴ありがとうございました。clineが役に立つことを願っています。あるいは、コンソールユーティリティを作成したい、あるいは少なくともgithubでフォークしたいという気持ちになっているかもしれません。

PS招待してくれたUFOに感謝します。

Source: https://habr.com/ru/post/J196380/


All Articles