現象
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 clean
や concurrency
の設定も試してみたが解決しなかった。
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つの方法が考えられる。
- ホームディレクトリをvolfs上に変える
- yarnの設定でキャッシュの場所をvolfs上に変える
いずれにせよ、yarnのキャッシュが保存される場所をvolfsで管理されるようなパスに変更するということが必要になる。前者のほうが他の潜在的なトラブルも一気に解決できるので良さそうだが、ホームディレクトリの変更後から暫く時間が経ってしまっており、今から戻すのは面倒そうなので、今回はyarnの設定を触る2番を採用した。
yarn cache dir
で現在のキャッシュパスを確認した後、再び yarn cache dir
で変更されたことを確認。
yarn config set cache-folder /home/cosnomi/.cache
まとめ
WSL上のyarn installでENOENTが発生した現象は、yarnのキャッシュパスをvolfsで管理される場所に変更することで解決した。
余談
WSLでホームディレクトリを /mnt/c
以下に変更したくなる気持ちは分かるが、今回のようにファイルシステムの相違によるトラブルが多発しそうなので辞めたほうが良いと思った。今から、WSLを使い始める人にはおすすめしません。ちなみに、近々WSL2というのがリリースされ、そこではLinuxのファイルシステムをより直接的に扱える(=アクセス速度の大幅な改善、ファイルシステムの違いによる問題の減少)ようで、大変楽しみ。