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

本業で開発をしている時、 EsLint の挙動で詰まったので、その時対処したことをメモしておく.


詰まった内容は以下だ:

同じコマンドを実行しているはずなのに出力される結果が違うので困っています。
開発環境では通って、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 貼ってるだけのようだ.

一通り使って違いのわかる男になりたい.