コマンドラインオプションを解析するためのNode.jsパッケージを参照する

Node.jsは、他の開発環境と同様に、コマンドラインオプションを操作するための基本的なツールを提供します。 私たちの場合、これはprocess.argv配列です。 ただし、通常、A + Bなどの最も単純な場合を除き、コマンドラインオプションを手動で操作するのは非常に不便です。 これにはいくつかの一般的なパッケージがあります。 著者は、これらのパッケージのピボットテーブルを作成する小さなプログラムを作成し、それらから最も人気のある3つを選択し、それらをより詳しく調べました。


(2019年2月8日の記事資料は引き続き関連しており、要約表は更新され、補足されています。)


要約表


(狭いページ形式のため、1つのテーブルを2つに分割する必要がありました。1つはNPMからの情報、もう1つはGitHubからの情報です。)


NPMパッケージNPMスター非推奨最終バージョン最終更新作成しました依存関係
1司令官10082.19.02019-01-012011-08-150
2ヤーグ50812.0.52019-02-032013-11-2312
3ミニスト4301.2.02019-01-042013-06-250
4楽観主義者143V0.6.12018-03-212010-12-212
5ニャー785.0.02019-02-042013-01-249
6cli691.0.12018-03-152011-01-012
7うん474.0.12017-10-182011-03-302
8コマンドライン引数495.0.22018-06-252014-05-275
9名義32V1.8.12018-03-172011-04-082
10argparse211.0.102018-02-272012-05-171
11stdio90.2.72017-12-012013-03-160
12ダッシュダッシュ91.14.12017-12-282013-02-281
13has-flag53.0.02018-03-202015-07-080
14clp24.0.112019-01-032015-04-173
15拍手11.2.32017-09-202014-02-101
16アルゼンチン00.6.02016-07-292015-11-260
17getoptie01.0.22015-03-092015-03-090

NPMパッケージGithubリポジトリGithubスター最後のコミット
1司令官tj / commander.js141112018-12-28
2ヤーグyargs / yargs57602019-02-08
3ミニストサブスタック/ミニミスト34432015-08-29
4楽観主義者サブスタック/ノードオプティミスト25592014-02-05
5ニャーシンドレソルフス/ニャー16512018-11-05
6clinode-js-libs / cli7652016-10-23
7うんnpm / nopt4682019-01-26
8コマンドライン引数75lb /コマンドライン引数3592019-01-21
9名義ハーサー/ nomnom4682015-09-09
10argparsenodeca / argparse2912018-12-01
11stdiosgmonda / stdio1392017-01-24
12ダッシュダッシュtrentm / node-dashdash1232017-04-18
13has-flagsindresorhus / has-flag422018-12-25
14clpIonicaBizau / CLP122019-01-03
15拍手ラフマティ/拍手152017-09-20
16アルゼンチンラムキン/アルゼンチン02016-07-29
17getoptieavz / node-getoptie02015-03-09

このテーブルは、小さなJavaScriptプログラムによって生成されました。 このプログラムを含むこのレビューのソースコードは、 GitHubのリポジトリにあります 。 しばらくすると、このデータは古くなる可能性が高いため、このソースコードを読み込んでこのテーブルを再生成し、パッケージのリストを含むファイルに適切な行を追加するだけで新しいデータを追加できます。


表内のパッケージは、次の式に従ってNPMとGitHubの星の数に基づいて計算される評価でソートされます。


 npmStars * k + githubStars 

NPMの星はGitHubの星よりも「重く」見えるため、 k係数が必要でした。 係数自体は非常に単純であると見なされます。NPMとGitHubの星の数を合計し、GitHubの星の数をNPMの星の数で除算し、結果の数を丸めます。これは係数kです。


 k = floor( Sgithub / Snpm) 

結果の表から、主なお気に入りは司令官パッケージであることが明確にわかります。 次に、近い評価のミニミストyargsパッケージが登場します楽観主義者のパッケージにも良い評価がありますが、作者によって廃止されたと宣言されており、その代わりに彼は自分が書いたミニミストのパッケージを推奨し、 yargsnomnom調べることも勧めています。 楽観主義者の後継者として、 yargsパッケージも位置付けられています。 非推奨のnomnomの作成者は、 commanderを推奨します。


したがって、最初に考慮すべきことは、 commanderminimist、およびyargsパッケージです。 meownoptパッケージにも注意を払うのはおそらく理にかなっていますが 、今回はそうではありません。


司令官


commanderパッケージの使用方法を学ぶのは簡単です。 常に明確ではありませんが、著者はドキュメントを提供しました。 このパッケージの使用方法を理解するには、適切に実験する必要がありました。 以下に、このパッケージの主なポイントを説明します。


したがって、パッケージをダウンロードした後:


 const commander = require('commander') 

関数を順次または個別に呼び出すことにより、コマンドラインオプションを処理するように構成できます。 同時に、このパッケージは以下を提供します。



短いオプションは次のように宣言されます。


 commander .option('-a', 'option a') 

option関数の最初の引数はoptionの形式を設定し、2番目の引数は口頭での説明を与えます。 -aオプションには、対応するcommanderプロパティを介してプログラムコードでアクセスします。


 if (commander.a) { console.log(commander.a) } 

長いオプションの例:


 commander .option('--camel-case-option', 'camel case option') 

この場合、コード内のオプションへのアクセスはcamelCaseOptionという名前で発生します。


オプションのパラメーターとオプションのパラメーターの両方にパラメーターを設定することができます。


 commander .option('-s, --source <path>', 'source file') .option('-l, --list [items]', 'value list', toArray, []) 

2番目の場合、リストオプションのパラメーターはオプションで、ハンドラー関数と既定値が割り当てられます。


オプションパラメータは、たとえば次のような正規表現を使用して処理することもできます。


 commander .option('--size [size]', 'size', /^(large|medium|small)$/i) 

サブコマンドは、別個のモジュールがそのために作成されることを意味します。 さらに、メインプログラムがprogramであり、 commandサブコマンドである場合、サブコマンドのモジュールはprogram-command必要があります。 サブコマンドの後に渡されるオプションは、コマンドモジュールに渡されます。


 commander .command('search <first> [other...]', 'search with query') .alias('s') 

自動プロンプトの場合、プログラムのバージョンを指定できます。


 commander.version('0.2.0') 

ツールチップには、たとえば非標準のテキストで補足される追加のアクションが付随する場合があります。 これを行うには、 --helpイベントを処理する必要があります。


 commander.on('--help', () => { console.log(' Examples:') console.log('') console.log(' node commander.js') console.log(' node commander.js --help') console.log(' node commander.js -h') ... console.log(' node commander.js --size large') console.log(' node commander.js search ab c') console.log(' node commander.js -abc') }) 

process.argvパラメーターを指定してparse関数を呼び出すことにより、構成が完了します。


 commander.parse(process.argv) 

ミニスト


minimistパッケージの作成者は、非常に最小限のドキュメントを提供しました。 しかし、まだそれを理解してみてください。


パッケージをダウンロードしたら、接続して使用します。


 const minimist = require('minimist') const args = minimist(process.argv.slice(2)) console.dir(args) 

この簡単なコードにより、このパッケージの使用を開始できます。 実験してみましょう:


 node minimist.js 

 { _: [] } 

ここで何が見えますか? 解析されたオプションのセットは、オブジェクトに編成されます。 _という名前のプロパティには、オプションに関連付けられていないオプションのリストが含まれています。 例:


 node minimist.js abc 

 { _: [ 'a', 'b', 'c' ] } 

実験を続けましょう:


 node minimist.js --help 

 { _: [], help: true } 

ご覧のとおり、minimistはツールチップを自動的に表示するのではなく、単にこのオプションの利用可能性を判断します。


もっと実験してみましょう:


 node minimist.js -abc 

 { _: [], a: true, b: true, c: true } 

そうです。 もっと見てみましょう:


 node minimist.js --camel-case-option 

 { _: [], 'camel-case-option': true } 

ミニミストとは異なり、変換はありません。


パラメーター付きオプション:


 node minimist.js --source path 

 { _: [], source: 'path' } 

また、記号で動作します:


 node minimist.js --source=path 

 { _: [], source: 'path' } 

--を使用すると、特別なオプション転送モードがサポートされます。


 node minimist.js -h -- --size=large 

 { _: [ '--size=large' ], h: true } 

後続の引数は処理さ--ず、単に_プロパティに配置されます。


基本的にデータベースにあるのはこれだけです。 オプションの最小化が提供するものを見てみましょう。


コマンドライン引数の処理を構成するには、2番目のパラメーターを設定とともにパーサーに渡す必要があります。 以下の例を検討してください。


 const minimist = require('minimist') const args = minimist(process.argv.slice(2), { string: ['size'], boolean: true, alias: {'help': 'h'}, default: {'help': true}, unknown: (arg) => { console.error('Unknown option: ', arg) return false } }) console.dir(args) 

 node minimist-with-settings.js --help 

 { _: [], help: true, h: true } 

 node minimist-with-settings.js -h 

 { _: [], h: true, help: true } 

--helpオプションを-h同義語に設定し--help 。 ご覧のとおり、結果は同じです。


booleanオプションをtrue設定すると、記号の後のパラメーターなしのすべてのオプションがブール値を持つことになります。 例:


 node minimist-with-settings.js --no-help 

 { _: [], help: false, h: false } 

ここでは、ブールオプションの処理方法を説明しましfalse 。プレフィックスnoはオプションをfalse設定します。


しかし、この例はもう機能しません。等号が必要です。


 node minimist-with-settings.js --size large 

 Unknown option: large { _: [], size: '', help: true, h: true } 

ここでは、不明なオプションとデフォルトのオプションの処理を見ました。


一般的な結論: commander比較すると、非常に最小限ですが、非常に便利です。


ヤーグ


ミニミストやコマンダーのyargsとは異なり、 参照により利用可能な非常に広範なドキュメントを提供します


通常どおり、最小限の例から始めます。


 const yargs = require('yargs') console.dir(yargs.argv) 

 node yargs.js 

 { _: [], '$0': 'yargs.js' } 

ここでは、生のオプションの空のリストと、プログラムのファイル名が表示されます。


より複雑な例を考えてみましょう。


 node yargs.js -abc --help --size=large 1 2 3 

 { _: [ 1, 2, 3 ], a: true, b: true, c: true, help: true, size: 'large', '$0': 'yargs.js' } 

ここではさらに興味深いものになります。まず、転送されたオプションが正しく認識されます。 第二に、それらを処理するコードを1行も作成しませんでした。


ただし、ここでは、意図したとおりに事前設定しないと--helpオプションが処理されないことがすでに--helpます。


次の例を使用して、より複雑なケースでyargsを使用する方法を見てみましょう。


 const yargs = require('yargs') yargs .usage('Usage: $0 -abc [--list 1,2,3] --size large|meduim|small [--help]') .version('1.0.0') .demand(['size']) .choices('size', ['large', 'medium', 'small']) .default('list', [], 'List of values') .describe('list', 'value list') .array('list') .help('help') .alias('help', 'h') .example('$0 --size=medium') .epilog('(c) 2016 My Name') console.dir(yargs.argv) 

 node yargs.js -h 

取得するもの:


 Usage: yargs.js -abc [--list 1,2,3] --size large|meduim|small [--help] Options: --version Show version number [boolean] --list value list [array] [default: List of values] --help, -h Show help [boolean] --size [required] [choices: "large", "medium", "small"] Examples: yargs.js --size=medium (c) 2016 My Name 

この例では、 helpオプションで表示されるテキストを設定します。 helpオプションもh同義語を示しました。 また、 versionオプションで表示されるプログラムのバージョンも示しました。


sizeオプションは必須です。さらに、有効な値のリストがあります。


 node yargs.js --size large 

 { _: [], version: false, help: false, h: false, size: 'large', list: [], '$0': 'yargs.js' } 

リストのいずれにも対応しない値がsize渡されると、エラーメッセージが表示されます。


 node yargs.js --size=middle 

 ... Invalid values: Argument: size, Given: "middle", Choices: "large", "medium", "small" 

listオプションにはデフォルト値があります。 このオプションは、値の配列としても扱われます。


 node yargs.js --list 1 2 3 --size=large 

 { _: [], version: false, help: false, h: false, list: [ 1, 2, 3 ], size: 'large', '$0': 'yargs.js' } 

まとめ


コマンダーミニミストのパッケージは、依存関係の最小数によって区別されますが、 yargsは依存関係の数だけでなく、その機能の数にも影響します。


どちらのパッケージが優れているかは言うまでもありません。 著者によると、 ミニミストは最も単純な場合には十分であるが、それを使用する困難な状況では、オプションを手動で処理するための多くのコードを書く必要があるだろう。 この場合、好みに応じて commanderまたはyargsを使用することをお勧めします。


ここで説明する3つのパッケージにはすべてTypeScript型定義が含まれているため、IntelliSenseをCodeで動作させることができます。


アーカイブ


2016年9月13日の最初の版、記事の冒頭の要約表は次のとおりでした。


要約表


更新する


さらに3つのパッケージがテーブルに追加され、読者からのコメントで報告されました。



npms.ioサービスのおかげで発見された2つのパッケージ:



したがって、以下の更新された表:


更新されたピボットテーブル


ちょっとした分析


この記事をHabrahabrで執筆および公開してから3か月後
2016年9月から12月にかけて、いくつかの興味深い変更がありました。
ピボットテーブル。


2016年12月の表



2016年12月30日の投票パターンは次のとおりです。 72人の読者が投票し、65人は棄権しました。
これらのうち、彼らは次のように投票しました。


  1. yargs 31%(22)
  2. 司令官29%(21)
  3. ミニミスト21%(15)
  4. process.argv 8%(6)
  5. その他のパッケージ7%(5)
  6. 楽観主義者4%(3)

yargscommanderには最大の人気がありますが、 minimist
また非常に人気があります。


2019年2月8日パッチ


サマリーテーブルが更新され、Markdown形式に変換され、 has-flagclp 、およびclapパッケージhas-flag追加されました。 投票結果は、2016年12月30日の最終更新時とほぼ同じままでした。



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


All Articles