概要
Node.js自体は3年ほど使用していてるが、単体プログラムでコマンドライン引数を必要としなかったので、いままで使うことがなかった。
コマンドライン引数が欲しくなったので、使おうとしたら少しハマったのでそれをまとめておく。
読者対象
- 将来Node.jsでコマンドライン引数を使いそうな方
経緯
コマンドライン引数が渡せない
コマンドライン引数なんてハイフンつけて実行するだけ(ハイフンはいらない模様、私の思い込みでした)。
実行するプログラムはindex.jsとし、オプションはbooleanのdevとする(開発モードで実行するシーンを想定)。
$ node index.js --dev
nodeコマンドならこれで行けた(もう一度言っておくがハイフンはいらない模様、大事なので2度言いました)。
npm runの際の注意点
nodeもnpmも同じと考えると次のようになる。
{
...
"scripts": {
...
"index": "node index.js",
...
},
...
}
$ npm run index --dev
実際に実行すると、index.jsにdevのコマンドライン引数は渡されません。
ここでしばらくはまる。
npmの公式ドキュメントは比較的わかりにくく気は進まなかったが、困ったときは公式ドキュメントということで参照する。
https://docs.npmjs.com/cli/run-script
As of npm@2.0.0, you can use custom arguments when executing scripts. The special option -- is used by getopt to delimit the end of the options. npm will pass all the arguments after the -- directly to your script:
npm run test -- --grep="pattern"
Google翻訳先生によると
npm@2.0.0以降、スクリプトを実行するときにカスタム引数を使用できます。特別なオプション -- は、オプションの終わりを区切るためにgetoptによって使用されます。 npmは -- の後のすべての引数をあなたのスクリプトに直接渡します。
私が解釈したところ、--の後にコマンドラインに渡したいパラメータ書け!
つまり最初の例を動かすにはこうする。
$ npm run index -- --dev
コマンドライン引数はパッケージを使う
戦いの末、書き方はわかった。
あとはindex.jsのほうでargsを取得すればいいのだが・・・、Node.jsのargsは使いやすいとはいいがたい。
パースやら意味解釈を自分でやる必要がある。
https://nodejs.org/docs/latest/api/process.html#process_process_argv
それじゃパッケージの出番ということでググると、おすすめを紹介されている記事を発見。いい感じ。
http://thr3a.hatenablog.com/entry/20181203/1543763623
念のためnpmで検索して、妥当性のチェック。
利便性、学習コスト、人気度、更新頻度、バンドルサイズ(ウェブアプリじゃないので今回は対象外)、いずれも申し分なし!
jsonで取得できるのが決め手。
https://www.npmjs.com/package/command-line-args
実際に書いたソースコード
…ブログの記事もあるし、パッケージのサンプルも丁寧なので、掲載の意味なしと判断してカット