この記事は怪奇現象に遭遇して治ったというメモです。最近こういう怪奇現象系の話が流行ってますね。なんマイルを超えるとメールが届かないとか、中国人の同僚がお茶を入れると必ずサーバが落ちる、とか。まぁ今回はそんな怪異の足元にも及ばないプチ怪異、話の肴にもならないようなやつですが、それはそうと自分が数ヶ月は困った怪異、後学のために残しておいたほうが良かろうと思ったのでメモを残します。
症状
任意のnpm
/ pnpm
/ yarn
プロジェクトをpnpm install
などして依存ライブラリをセットアップしようとすると、Error: EISDIR: illegal operation on a directory, read
というエラーが突然出てセットアップを続行できない。
% yarn yarn install v1.22.21 error Error: EISDIR: illegal operation on a directory, read info Visit https://yarnpkg.com/en/docs/cli/install for documentation about this command.
なんじゃこりゃ。yarn --verbose
などしても梨の礫で、さっぱり何が起こっているのか分からない。
対症療法として以下のような技を発明していたけど、あまりに何度も発生する割には身の回りではぜんぜん発生していないので、どこか自分のマシンに根本的原因があると確信。
推理
package.json
にとりあえず"workspaces": ["./"]
と書き付けるととりあえずインストールを続行できるということは分かっていたので、どうやらpackage.json
に原因があるらしい、というところまでは分かった。
調べているうちに、以下のような類似事例を発掘。
The problem was I had a
package.json
directory (not file) in my home directory (/Users/eli/package.json
).Fix:
rm -rf /Users/eli/package.json
なるほど、~/
になぜかpackage.json/
があったことでこれを誤認してyarn
などが狂ってしまうらしい。しかもファイルを想定しているはずがディレクトリに遭遇するのでyarn
は狼狽してクラッシュしてしまうというわけ*1。エラーメッセージがぜんぜん出ないわけだ。この仮説は、"workspaces": ["./"]
と書くととりあえず治る、という事実を支持する。yarn
の目には、検出されたプロジェクトルートは~/
であって、自分はたまたまその奥深くの別のディレクトリにcd
しているだけ、というふうに映るらしい。"workspaces": ["./"]
と書くとこの壊れた状況を糊塗して「元々あるべき状態」になっているようにyarn
を騙せる。しかしやはりどこかに綻びがあって、ひょんなタイミングで*2意味不明な壊れ方をしてしまう(自分の場合はnuxt
のバージョンを検知できない、という代物だった。そんなはずないだろ)。
しかしどこを探しても~/
にpackage.json
というファイルもディレクトリも存在しない。あわれ振り出しに戻るかと思ったが、しつこくcd ../
してpackage.json
があるか探して回ることにした。
したらなんと/
にpackage.json/
とpackage-lock.json/
という2つのディレクトリがご鎮座あそばされていやがった。なんでだよ。なんでなのかは分からないが、なんかタチの悪い操作を自分がやらかしたか、なんかタチの悪いインストールスクリプトが引っ掛けていったのだろう。この2つの落とし物を(細心の注意を払って)rm -rf
したところ、yarn
は快癒し元気に走り回り、山のような依存ライブラリを置いていってくれたではないか。
結語
npm
/pnpm
/yarn
の依存性インストール時にerror Error: EISDIR: illegal operation on a directory, read
と言われて黙ってしまったなら- そのアプリケーションのディレクトリから天井である
/
に至るまでのどこかのディレクトリにpackage.json/
やpackage-lock.json/
という変な名前のディレクトリが生えてないかを確認し - 生えていたら
ls
して練習した上で rm -rf
して掃除しなさい
今回はエラーメッセージこそ出るもののそれ以上の詳細が一切表示されない、なかなか手強い怪異であった。でもネタが分かってしまえばなんのことはない、そりゃそうなるでしょ、という類の怪異です。npm
系のマネージャは一番階層が上にあるpackage.json
を読みに行きます。それが/
にあってしかも壊れているとなれば、あらゆるディレクトリでうまくnpm
が動かなくなるというわけです。でもやっぱり個人的には、もうちょっとエラーメッセージを出してくれるとか、今どこのpackage.json
を読みに行こうとしたのか、なんてことを表示してくれたら良かったのに、と思うわけですね。