27
18

More than 5 years have passed since last update.

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

Posted at

概要

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:

27
18
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
27
18