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パッケージが登場します 。 楽観主義者のパッケージにも良い評価がありますが、作者によって廃止されたと宣言されており、その代わりに彼は自分が書いたミニミストのパッケージを推奨し、 yargsとnomnomを調べることも勧めています。 楽観主義者の後継者として、 yargsパッケージも位置付けられています。 非推奨のnomnomの作成者は、 commanderを推奨します。
したがって、最初に考慮すべきことは、 commander 、 minimist、およびyargsパッケージです。 meowとnoptパッケージにも注意を払うのはおそらく理にかなっていますが 、今回はそうではありません。
司令官
commander
パッケージの使用方法を学ぶのは簡単です。 常に明確ではありませんが、著者はドキュメントを提供しました。 このパッケージの使用方法を理解するには、適切に実験する必要がありました。 以下に、このパッケージの主なポイントを説明します。
したがって、パッケージをダウンロードした後:
const commander = require('commander')
関数を順次または個別に呼び出すことにより、コマンドラインオプションを処理するように構成できます。 同時に、このパッケージは以下を提供します。
-
-s
などの短いオプション。 -
--source
などの長いオプション。 -
--source
や-s
などの代替オプション名。 - 追加のパラメーター。
- 追加パラメーターのデフォルト値。
- 追加パラメーターのハンドラー。
- サブコマンド、たとえば、
install package
。 - 自動ツールチップ生成;
- プロンプトを設定します。
短いオプションは次のように宣言されます。
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つのパッケージがテーブルに追加され、読者からのコメントで報告されました。
- NPM: argparse | github : nodeca / argparse
- NPM: argentum | Github : ラムキン/アルゼンチン
- NPM: getoptie | Github : avz / node-getoptie
npms.ioサービスのおかげで発見された2つのパッケージ:
- NPM: cli | Github: node-js-libs / cli
- NPM: ダッシュダッシュ | Github : trentm / node-dashdash
したがって、以下の更新された表:
ちょっとした分析
この記事をHabrahabrで執筆および公開してから3か月後
2016年9月から12月にかけて、いくつかの興味深い変更がありました。
ピボットテーブル。
- 人気の低いモジュールを除き、ほとんどすべてのモジュールの評価が増加しました
stdio 、 getoptie 、 argentum 。 - フォワードはヤーグを「引っ張り」、2位になり、3番目のミニミストにシフトしました。
これは理解できます。ミニミストは1年以上開発されていませんが、
yargsの場合、新しいバージョンが定期的にリリースされます。 - コマンドライン引数パッケージはstdioをバイパスしました。
- 14個のパッケージのうち、位置を改善したのは2個だけです。 しかし、評価成長率
異なるため、数か月以内に新しいお気に入りの特定が期待できます。 - 次のモジュールは改善されていません:ミニミスト、オプティミスト(非推奨)、
nomnom(非推奨)、stdio、getoptie、argentum。 おそらく、これらのモジュールはまもなく利用可能になるでしょう。
非推奨を宣言します。
私がしたい最も重要な結論は、検討する価値があるということです。
新しいプロジェクトで人気のあるミニミストを使用する必要がありますか?彼は
長い間開発されていませんか?
2016年12月30日の投票パターンは次のとおりです。 72人の読者が投票し、65人は棄権しました。
これらのうち、彼らは次のように投票しました。
- yargs 31%(22)
- 司令官29%(21)
- ミニミスト21%(15)
- process.argv 8%(6)
- その他のパッケージ7%(5)
- 楽観主義者4%(3)
yargsとcommanderには最大の人気がありますが、 minimist
また非常に人気があります。
2019年2月8日パッチ
サマリーテーブルが更新され、Markdown形式に変換され、 has-flag
、 clp
、およびclap
パッケージhas-flag
追加されました。 投票結果は、2016年12月30日の最終更新時とほぼ同じままでした。