Cosnomi
Cosnomi

医療×IT / 医学生 / Web(React, Flask) / 機械学習(画像認識, Keras)

Twitter / GitHub / Keybase

WSLのyarn installでENOENTエラー

現象

WSLで yarn install すると

ENOENT: no such file or directory, lstat '/mnt/c/Users/Username/.cache/yarn/v4/npm-json5-2.1.0-e628cc48ca2c25c628d2085380b89bb807057a08/node_modules/json5/dist/index.min.mjs'

のようなエラーが出て正常に完了しない。

yarn cache cleanconcurrencyの設定も試してみたが解決しなかった。

tl;dr

私の環境では、ホームディレクトリ (~)を/home/Usernameから/mnt/c/Users/...に変更していた。このほうがいろいろと作業しやすいと考えたためだが、これが裏目に出ていた。ホームディレクトリを変えても良かったのだが、yarnのキャッシュの場所を/home/Username/...に変更した。

ファイルシステム

yarnはキャッシュを~/.cache/yarn/v4に保存する。つまり、私の環境では/mnt/c以下の領域に保存されることになる。WSLでは/mnt/cではdrvfs、それ以外ではvolfsというファイルシステムを用いられるが、これらのファイルシステムにはいくつか違いがある。簡潔にまとめるとdrvfsはWindows環境からアクセスされる(むしろWindows環境で作成したファイルにアクセスする)のに対し、volfsはWindowsからアクセスされることを想定しておらず、Linuxシステムにとって都合の良い仕組みになっている。具体的には、permissionやsymbolic linkなどの点で異なる。

WSL上でyarnをインストールするとき、もちろんLinux版のyarnがインストールされるので、yarnは通常のLinux環境、通常Linuxで用いられるようなファイルシステム上で動くことを想定する。しかしこれだけで直ちに問題になることはない。なぜなら、デフォルトではWSLの~/.cache/yarn/v4はvolfsで管理されており、volfsはLinuxで使われるファイルシステムを十分に再現しているからである。

しかし、今回はキャッシュのパスをvolfsではなくdrvfsで管理されるパスにしてしまったため、このようなエラーが起こったと考えられる。

解決

2つの方法が考えられる。

  1. ホームディレクトリをvolfs上に変える
  2. yarnの設定でキャッシュの場所をvolfs上に変える いずれにせよ、yarnのキャッシュが保存される場所をvolfsで管理されるようなパスに変更するということが必要になる。前者のほうが他の潜在的なトラブルも一気に解決できるので良さそうだが、ホームディレクトリの変更後から暫く時間が経ってしまっており、今から戻すのは面倒そうなので、今回はyarnの設定を触る2番を採用した。

yarn cache dirで現在のキャッシュパスを確認した後、

yarn config set cache-folder /home/cosnomi/.cache

再びyarn cache dirで変更されたことを確認。

まとめ

WSL上のyarn installでENOENTが発生した現象は、yarnのキャッシュパスをvolfsで管理される場所に変更することで解決した。

余談

WSLでホームディレクトリを/mnt/c以下に変更したくなる気持ちは分かるが、今回のようにファイルシステムの相違によるトラブルが多発しそうなので辞めたほうが良いと思った。今から、WSLを使い始める人にはおすすめしません。ちなみに、近々WSL2というのがリリースされ、そこではLinuxのファイルシステムをより直接的に扱える(=アクセス速度の大幅な改善、ファイルシステムの違いによる問題の減少)ようで、大変楽しみ。