さかなソフトブログ

プログラミングやソフトウェア開発に関する情報

ツール

yarnのキャッシュを理解してnode_modulesを正しく更新する

更新日:

Yarn
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でのパッケージ管理には戻れなくなるはずです。高速化の為にキャッシュされる仕組みは仕方がないので上手く挙動と付き合っていきたいところですね;)

正方形336

正方形336

-ツール
-, ,

Copyright© さかなソフトブログ , 2019 All Rights Reserved.