EsLintでGlobの挙動で詰まった時のメモ

Table of Contents

詰まった内容は以下だ。

同じコマンドを実行しているはずなのに出力される結果が違うので困っています。
開発環境では通って、circleci上ではエラーが出ている状態です。

A: npm run test:lint
B: ./node_module/.bin/eslint --debug app/javascript/**/*.{vue,ts}

"scripts": {
"test:lint": "eslint --debug app/javascript/**/*.{vue,ts}"
}

AB で同じコードを実行しているはずなのでなぜか違う結果を吐き出すのだ。 local では eslint が通るけど circleci ではコケる、といった問題が起きていて困っていた。

ちなみに、 eslint --debug で実行ログをみることができる。

ESLint開発者の方と弊社CTOのBTOさんに教えてもらうことによって原因を突きとめることができた。


原因は、「globの解釈の問題」だ。

そもそもglobとはWikiによるとこんな感じ。

グロブ(英: glob)とは主にUnix系環境において、ワイルドカードでファイル名のセットを指定するパターンのことである。

今回の場合だと、2種類の解釈のし方がある。

  • shellでglobが解釈される
  • npmのglobで解釈される

macの標準のshellは bash なのだが、これだとうまくglobを評価してくれないのだ。一方、circleciのコンテナのshellは busybox だったのでうまくglobを評価してくれた。

つまり、macではちゃんと動いていなかっただけだったのだ。

そこで以下のようにglob部分を ' で囲った。

"scripts": {
    "test:lint": "eslint --debug 'app/javascript/**/*.{vue,ts}'"
}

そうすることにより、 npmのglobで解釈される ようになり、正常に動くようになった。

内部的にはこれを使っているみたいだ。

https://www.npmjs.com/package/glob


この世界にはたくさんのshellがあるようだ。

  • dash(debian ash)
  • ash
  • busybox
  • fish shell
  • xonsh shell
  • z shell
  • bash
  • etc

Ubuntu標準は dash みたいだ。

~/.emacs.d (*´ω`*) < ll /bin | grep sh
-rwxr-xr-x 1 root root 1.1M  5月  3 22:50 bash
-rwxr-xr-x 1 root root 119K  1月 25  2018 dash
lrwxrwxrwx 1 root root    4  5月  3 22:50 rbash -> bash
lrwxrwxrwx 1 root root    4  3月  3 18:34 sh -> dash
lrwxrwxrwx 1 root root    4  3月  3 18:34 sh.distrib -> dash
lrwxrwxrwx 1 root root    7  3月  7 05:51 static-sh -> busybox

sh って言うけど、 /bin/sh に別の shellsymbolic link 貼っているだけのようだ。