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

Node.jsは、他の開発環境と同様に、コマンドラインオプションを操作するための基本的なツールを提供します。 私たちの場合、これはprocess.argv



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







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







要約表



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







NPMパッケージ NPMスター 非推奨 最終バージョン 最終更新 作成しました 依存関係
1 司令官 1008 2.19.0 2019-01-01 2011-08-15 0
2 ヤーグ 508 12.0.5 2019-02-03 2013-11-23 12
3 ミニスト 430 1.2.0 2019-01-04 2013-06-25 0
4 楽観主義者 143 V 0.6.1 2018-03-21 2010-12-21 2
5 ニャー 78 5.0.0 2019-02-04 2013-01-24 9
6 cli 69 1.0.1 2018-03-15 2011-01-01 2
7 うん 47 4.0.1 2017-10-18 2011-03-30 2
8 コマンドライン引数 49 5.0.2 2018-06-25 2014-05-27 5
9 名義 32 V 1.8.1 2018-03-17 2011-04-08 2
10 argparse 21 1.0.10 2018-02-27 2012-05-17 1
11 stdio 9 0.2.7 2017-12-01 2013-03-16 0
12 ダッシュダッシュ 9 1.14.1 2017-12-28 2013-02-28 1
13 has-flag 5 3.0.0 2018-03-20 2015-07-08 0
14 clp 2 4.0.11 2019-01-03 2015-04-17 3
15 拍手 1 1.2.3 2017-09-20 2014-02-10 1
16 アルゼンチン 0 0.6.0 2016-07-29 2015-11-26 0
17 getoptie 0 1.0.2 2015-03-09 2015-03-09 0


NPMパッケージ Githubリポジトリ Githubスター 最後のコミット
1 司令官 tj / commander.js 14111 2018-12-28
2 ヤーグ yargs / yargs 5760 2019-02-08
3 ミニスト サブスタック/ミニミスト 3443 2015-08-29
4 楽観主義者 サブスタック/ノードオプティミスト 2559 2014-02-05
5 ニャー シンドレソルフス/ニャー 1651 2018-11-05
6 cli node-js-libs / cli 765 2016-10-23
7 うん npm / nopt 468 2019-01-26
8 コマンドライン引数 75lb /コマンドライン引数 359 2019-01-21
9 名義 ハーサー/ nomnom 468 2015-09-09
10 argparse nodeca / argparse 291 2018-12-01
11 stdio sgmonda / stdio 139 2017-01-24
12 ダッシュダッシュ trentm / node-dashdash 123 2017-04-18
13 has-flag sindresorhus / has-flag 42 2018-12-25
14 clp IonicaBizau / CLP 12 2019-01-03
15 拍手 ラフマティ/拍手 15 2017-09-20
16 アルゼンチン ラムキン/アルゼンチン 0 2016-07-29
17 getoptie avz / node-getoptie 0 2015-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-flag



clp



、およびclap



パッケージhas-flag



追加されました。 投票結果は、2016年12月30日の最終更新時とほぼ同じままでした。








All Articles