yarnを利用してnode_modulesをインストールした後にローカルで直接フォルダを削除したり編集したりしたら更新出来なくなって困ったことはないでしょうか?yarnは高速化の為に必要なnpmは一旦ローカルにキャッシュされています。キャッシュするフォルダパスは
$ yarn cache dir
で確認出来ます。また、古いnpmバージョンも全てキャッシュします。キャッシュされているnpmリストは
$ yarn cache list
で確認出来るので、キャッシュ量が気になってきたら以下でクリアすると良いでしょう:
$ yarn cache clean
インストール時のキャッシュの利用のしかたを理解する
yarnではどのようにキャッシュが利用されているか理解する為にpackage.jsonを作成するところから実験してみます。今回はmime npmをyarn-testフォルダにインストールしてみます:
$ mkdir yarn-test
$ cd yarn-test
$ yarn init
yarn init v1.2.1
question name (yarn-test):
question version (1.0.0):
question description:
question entry point (index.js):
question repository url:
question author:
question license (MIT):
question private:
success Saved package.json
✨ Done in 3.44s.
$ yarn add mime
yarn add v1.2.1
info No lockfile found.
[1/4] ? Resolving packages...
[2/4] ? Fetching packages...
[3/4] ? Linking dependencies...
[4/4] ? Building fresh packages...
success Saved lockfile.
success Saved 1 new dependency.
└─ mime@2.2.0
✨ Done in 0.49s.
$ ls -a
. .. node_modules package.json yarn.lock
$ ls -a node_modules/
. .. .bin .yarn-integrity mime
package.jsonにmimeが追加され、インストールされた依存npmがyarn.lockに記録され、node_modulesに実際にインストールされたことが見てとれます。ここで注目したいのは.yarn-integrityで、yarnでインストールしたnpm情報が記録されておりこれによってキャッシュからnpmをコピーしてくる仕組みになっているようです。中身を参照すると以下の様になっています:
{
"modulesFolders": [
"node_modules"
],
"flags": [],
"linkedModules": [],
"topLevelPatterns": [
"mime@^2.2.0"
],
"lockfileEntries": {
"mime@^2.2.0": "https://registry.yarnpkg.com/mime/-/mime-2.2.0.tgz#161e541965551d3b549fa1114391e3a3d55b923b"
},
"files": [],
"artifacts": {}
}
yarn installを実行すると.yarn-integrityとyarn.lockを参照してnode_modules内にnpmがインストールしているかチェックしているようです。因みにyarnでのインストール状況はyarn check
で確認出来ます:
$ yarn check
yarn check v1.2.1
success Folder in sync.
✨ Done in 0.11s.
yarnでパッケージ管理を行った場合は基本的には直接node_modulesを触らない方が良いようです。
node_modules内を編集した際に正しく更新する(元に戻す)
しかしながら、インストールした依存npm自体をデバッグや開発したい場合にnode_modules内を直接編集したい場合は出てくることはあります。実際に編集してみて挙動を理解してみます。まずはmimeフォルダを削除してみます:
$ rm -rf node_modules/mime/
$ yarn check
yarn check v1.2.1
error "mime" not installed
error Found 1 errors.
$ yarn
yarn install v1.2.1
[1/4] ? Resolving packages...
success Already up-to-date.
✨ Done in 0.11s.
$ ls -a node_modules/
. .. .bin .yarn-integrity
mimeフォルダを削除して再度yarnでインストールしてもインストールされません。これは.yarn-integrityで既にインストール済みと認識されているからです。削除してしまったnpmを再度キャッシュからインストールするには--check-files
を利用します:
$ yarn --check-files
yarn install v1.2.1
[1/4] ? Resolving packages...
[2/4] ? Fetching packages...
[3/4] ? Linking dependencies...
[4/4] ? Building fresh packages...
✨ Done in 0.18s.
$ ls -a node_modules/
. .. .bin .yarn-integrity mime
これで削除したモジュールも元に戻すことが出来ました。次はmimeフォルダ内を編集してみます:
$ vi node_modules/mime/index.js # 中身を削除して保存してみる
$ yarn check
yarn check v1.2.1
success Folder in sync.
✨ Done in 0.11s.
$ yarn --check-files
yarn install v1.2.1
[1/4] ? Resolving packages...
success Already up-to-date.
✨ Done in 0.12s.
今度は削除では無いので--check-filesでインストールしても元に戻りません。この場合は--force
オプションで全依存モジュールを再度更新する必要があります:
$ yarn --force
yarn install v1.2.1
[1/4] ? Resolving packages...
[2/4] ? Fetching packages...
[3/4] ? Linking dependencies...
[4/4] ? Rebuilding all packages...
success Saved lockfile.
✨ Done in 0.17s.
これで編集ファイルも無事元に戻りました。
まとめ
最後にもう一度ポイントをまとめておきましょう:
- yarnでパッケージ管理する場合はnode_modules内はなるべく直接触らない
- node_modules内のファイルを削除した場合は
--check-files
を使う - node_modules内のファイルを編集した場合は
--force
を使う
yarnはとても便利で、一度利用したらnpmでのパッケージ管理には戻れなくなるはずです。高速化の為にキャッシュされる仕組みは仕方がないので上手く挙動と付き合っていきたいところですね;)