2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

npx で実行するか npm scripts で実行するかで glob パスの解釈が違う

Last updated at Posted at 2018-10-30

自分が困ったので、備忘録として残す。

node_modules/ 内のモジュールを実行する際、対象ファイルの指定をマルチパス形式で「〜ディレクトリ配下すべて」と記述すると、npx と npm scripts で処理対象となるファイルが異なる。
(※今回はstylelintを例に説明)

事象

package.json
"scripts" : {
  "stylelint": "stylelint resources/assets/sass/test/**/*.scss",
}

上記npm scriptsを用意した状態で実行する npm run stylelint
npx stylelint resources/assets/sass/test/**/*.scss で、処理対象となるファイルに違いが出た。
npx はディレクトリを再帰的に掘って走査してくれるが、npm scripts では第一階層しか探してくれない。

これを、npm scripts でも配下すべてのディレクトリを再帰的に走査するようにしたい。

※再現環境
macOS 10.14
Node.js 10.9.0
npm 6.2.0

解決方法

パスをシングルクォーテーションで囲む。
つまり、以下のように記述する。

package.json
"scripts" : {
  "stylelint": "stylelint 'resources/assets/sass/test/**/*.scss'",
}

事象の再現・調査

最初にキックされるJSファイルに console.log を仕込み、実際に対象になっているファイルの規則性を確かめる。

node_modules/stylelint/bin/stylelint.js
#!/usr/bin/env node

"use strict";

console.log(process.argv); // この1行を追加

require("../lib/cli")(process.argv.slice(2));

この状態でそれぞれコマンドを叩き、結果を比較する。

↓出力結果(npm scripts)

npm run stylelint
> @ stylelint /Users/[プロジェクトディレクトリまでのフルパス]
> stylelint resources/assets/sass/test/**/*.scss

[ '/Users/[ユーザ名]/.nodebrew/node/v10.9.0/bin/node',
  '/Users/[プロジェクトディレクトリまでのフルパス]/node_modules/.bin/stylelint',
  'resources/assets/sass/test/pages/_style.4.scss',
  'resources/assets/sass/test/settings/_style.5.scss',
  'resources/assets/sass/test/settings/_style.6.scss' ]

↓出力結果(npx)

npx stylelint resources/assets/sass/test/**/*.scss
[ '/Users/[ユーザ名]/.nodebrew/node/v10.9.0/bin/node',
  '/Users/[プロジェクトディレクトリまでのフルパス]/node_modules/.bin/stylelint',
  'resources/assets/sass/test/_style.scss',
  'resources/assets/sass/test/pages/1/_style.1.scss',
  'resources/assets/sass/test/pages/2/2-1/_style.2.scss',
  'resources/assets/sass/test/pages/2/_style.3.scss',
  'resources/assets/sass/test/pages/_style.4.scss',
  'resources/assets/sass/test/settings/_style.5.scss',
  'resources/assets/sass/test/settings/_style.6.scss' ]

対象となるファイルに違いがあることが判明した。

まとめ

  • 勉強不足で Node.js の中の仕組みに詳しくなく、どうしてこうなるのかまではまだ理解できていません。。分かり次第追記したいと思います。
  • 同じJSがキックされているのに解釈が違うので、stylelint 以外のnpmモジュールでも再現します。
  • 学びとしては「npm scripts の中に書くパスはシングルクォーテーションでくくったほうが無難」という小さな内容ですが、気をつけていきたいです。
2
2
0

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
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?