Lambdaカクテル

京都在住Webエンジニアの日記です

Invite link for Scalaわいわいランド

怪奇現象: npm/pnpm/yarnプロジェクトをセットアップするとError: EISDIR: illegal operation on a directory, readと言われる。ラッキーアイテムはpackage.json

この記事は怪奇現象に遭遇して治ったというメモです。最近こういう怪奇現象系の話が流行ってますね。なんマイルを超えるとメールが届かないとか、中国人の同僚がお茶を入れると必ずサーバが落ちる、とか。まぁ今回はそんな怪異の足元にも及ばないプチ怪異、話の肴にもならないようなやつですが、それはそうと自分が数ヶ月は困った怪異、後学のために残しておいたほうが良かろうと思ったのでメモを残します。

症状

任意の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などしても梨の礫で、さっぱり何が起こっているのか分からない。

対症療法として以下のような技を発明していたけど、あまりに何度も発生する割には身の回りではぜんぜん発生していないので、どこか自分のマシンに根本的原因があると確信。

blog.3qe.us

推理

package.jsonにとりあえず"workspaces": ["./"]と書き付けるととりあえずインストールを続行できるということは分かっていたので、どうやらpackage.jsonに原因があるらしい、というところまでは分かった。

調べているうちに、以下のような類似事例を発掘。

github.com

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を読みに行こうとしたのか、なんてことを表示してくれたら良かったのに、と思うわけですね。

この怪奇現象に遭遇した人はこんな怪奇現象にも遭遇しています

blog.3qe.us

*1:ちっとは例外補足してほしいもんだが

*2:アンジャッシュのすれ違いコントめいた

★記事をRTしてもらえると喜びます
Webアプリケーション開発関連の記事を投稿しています.読者になってみませんか?