HERSHY'SのAdvent Calendar(本物)の2日目を開けたところ。
NPMおれおれAdvent Calendar 2019 – 02日目

先にまとめ

  • 間に -- を挟む
    • e.g. npm run lint -- --fix

ESLint の例

例えばESLint は --fix で(可能な内容なら)自動で修正してくれます。

$ eslint src --fix

が、例えば npm run lint で ESLint が動くとして、これだと自動修正は動かないです。

$ npm run lint --fix

これは --fix が ESLint じゃなくて NPM の方の引数として認識されてしまうためです。

スクリプトの方に与える場合は -- を挟みます。

$ npm run lint -- --fix

これで OK 。

スクリプトの内容が複雑な場合

ls はディレクトリーの内容(ファイルとか)を一覧表示するコマンドです。

sl はジョークコマンドで、汽車が走るやつです。

&& で複数繋がっている場合

例えばこんなスクリプトだとどうなると思いますか。

[json] “scripts”: { “sl-ls”: “sl && ls” }, [/json]
$ npm run sl-ls -- -l

さあどれだ。

  1. 最初のコマンド sl-l がかかる
  2. 最後のコマンド ls-l がかかる
  3. 両方のコマンド sl, ls-l がかかる

ドキュメントにも特段乗っていないみたいなんだけど、試してみると最後のにのみかかります。

というかたぶん連結してるだけだよね。ターミナルの出力もそんな感じだし。

$ npm run slls -- -l

> @ slls /path/to/project
> sl && ls "-l"

total 308
drwxrwxrwx 1 ginpei ginpei   4096 Nov  2 00:29 node_modules
-rwxrwxrwx 1 ginpei ginpei    210 Nov  2 02:22 package.json
-rwxrwxrwx 1 ginpei ginpei 314804 Nov  2 00:26 yarn.lock
…

pre, post がある場合

さてこれはどうでしょう。

[json] “scripts”: { “prels”: “sl”, “ls”: “ls”, “postls”: “sl” }, [/json]
$ npm run ls -- -l
  • prels-l がかかる or かからない
  • ls-l がかかる or かからない
  • postls-l がかかる or かからない

これはドキュメントに掲載されています。

The arguments will only be passed to the script specified after npm run and not to any pre or post script.

引数は npm run の後ろに指定されたスクリプトにのみ渡され、pre や post のスクリプトには渡されません。

参考