Help us understand the problem. What is going on with this article?

npm runでコマンドライン引数を渡す方法

概要

Node.js自体は3年ほど使用していてるが、単体プログラムでコマンドライン引数を必要としなかったので、いままで使うことがなかった。
コマンドライン引数が欲しくなったので、使おうとしたら少しハマったのでそれをまとめておく。

読者対象

  • 将来Node.jsでコマンドライン引数を使いそうな方

経緯

コマンドライン引数が渡せない

コマンドライン引数なんてハイフンつけて実行するだけ(ハイフンはいらない模様、私の思い込みでした)。
実行するプログラムはindex.jsとし、オプションはbooleanのdevとする(開発モードで実行するシーンを想定)。

$ node index.js --dev

nodeコマンドならこれで行けた(もう一度言っておくがハイフンはいらない模様、大事なので2度言いました:relaxed:)。

npm runの際の注意点

nodeもnpmも同じと考えると次のようになる。

package.json
{
  ...
  "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

実際に書いたソースコード

…ブログの記事もあるし、パッケージのサンプルも丁寧なので、掲載の意味なしと判断してカット:joy:

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした