🍓

yarn berryでnode-modulesを使っている時に.yarn/cacheをGit管理対象に入れるか入れないか

2023/07/11に公開

この記事では、"Yarn Berry"と記載したらYarnのバージョン2.x.x以降(具体的にはv3.6.1)を指していることとします。

yarn berryでは.yarnディレクトリ内に色んなメタファイルが生成されます。その中でも.yarn/cacheはかなり特徴的なディレクトリだと思います。
これまで.yarn/cacheは管理対象にしていましたが、お世話になっているフロントエンドつよつよマンからアドバイスをもらい考え直した結果、.yarn/cacheディレクトリをgitignoreから外しました。
.yarn/cacheを管理対象にするかしないかを考える際に参考になれば幸いです。

.yarn/cacheの役割

.yarn/cacheはyarn berryで yarn install をすると作られます。依存パッケージがzipファイルに圧縮されてダウンロードされます。
PnPモードを使っている時はその後.pnp.cjsが作られて終わりますが、nodeLinker: node-modules を使っている場合zipファイルがnode_modulesに展開されました。

.yarn/cacheをGitの管理対象に入れていない場合はPnPモードとnode_modulesどちらを利用していても最初にzipのダウンロードが発生します。もちろん.yarn/cacheの中に必要なパッケージのzipがない場合も追加でダウンロードが発生します。

.yarn/cacheをGitの管理対象に入れている場合はどうでしょうか。

PnPモードを利用している場合、リポジトリをCloneした時点で yarn install を実行しなくても yarn dev 等が実行できます。これはyarn berryが掲げるZero-Installsで、インストールなしでプロジェクトのセットアップが終わります。

ではnode_modulesを使う場合はどうでしょうか。node_modulesの場合は yarn install は必要なのでZero-Installとまではいきません。しかしすでにダウンロードされた状態のzipファイルが展開されるだけでいいのでその分多少早くなります。
PnP+Zero-Installを使わない場合でも、.yarn/cacheを管理対象に入れるメリットはありそうです。

ちなみに公式から提示されている.gitignoreの設定ではZero-Installsを使う場合は.yarn/cacheを管理対象にし、使わない場合は管理対象から外すように書かれています。node_modulesを使っている時のことは明記されていませんでしたが、おそらく後者の管理対象から外す方に該当すると思われます。
ただ上記のように一定のメリットはあると思ったので、どちらを選択するかはプロジェクト内でよく検討した上で決めるべきかと思います。

which-files-should-be-gitignored
https://yarnpkg.com/getting-started/qa#which-files-should-be-gitignored

.yarn/cacheをGit管理対象に入れるメリット・デメリット

以下に.yarn/cacheをGit管理対象に入れるかどうか検討する際に考えられるメリットとデメリットを公式サイトも見つつ自分なりに挙げてみました。今回僕が携わるプロジェクトでは、メリットよりデメリットの方が大きいと感じて公式の推奨通りの.gitignoreに変えました!

メリット

1. プロジェクトのセットアップが早くなる

上述の通り yarn install が不要またはかなり早くなります。フロントエンドって依存関係が多くなる傾向にあると思いますので、かなり恩恵はありました。

2. 認証なしでも限定共有のライブラリが使える

Github Package Repository等の認証が必要な限定共有パッケージを使用している場合に、バージョンが変更された時以外は新たに認証をせずにそのまま使用できます。これはCodeartifactを使っているときにCircleCIで yarn install を使うときに、毎回トークンを取得しなくても使えたのでよかったです。
もちろんこれはセキュリティ的にどうなの、、、という話もありますので一長一短だと思います。

3. (公式より)オフラインでも作業できる

ダウンロードが発生しないためオフラインで作業する場合も使えます。でもオフラインで作業することってほとんどないですね。

デメリット

1. リポジトリサイズの肥大

.yarn/cacheには依存するパッケージのzipファイルが配置されます。圧縮されているとはいえ依存パッケージの依存パッケージの依存パ...も入ってしまうので、そこそこのファイルサイズになります。当然Cloneするサイズが大きくなるので、CI内でCloneしたり新しいメンバーが入ったときにCloneするときも大量のファイルをダウンロードすることになります。

2. PRの差分の肥大

↑と同じような感じです。dependenciesに何かを追加するたびに、.yarn/cacheのzipファイルも追加/変更されため、それらをリポジトリにpushする必要があります。当然それらは差分となりますので、PRのサイズが肥大します。何度か、数100ファイルの差分があるけど実際修正してるのは5ファイルくらい、のような大変よろしくないPRをぶん投げてしまったこともありました。(レビュワーさん、ほんまにすまんかった、、、)
GithubのFilterで.zipを除外すれば画面上の数は減りますが、最初に差分画面を開いた時にものすごく重いです。

まとめ

  • .yarn/cacheは依存するライブラリを圧縮してダウンロードする場所
  • .yarn/cacheを管理対象に入れるとPnPモードではZero-Installsになり、node_modulesモードでは若干セットアップが早くなる
  • .yarn/cacheをGit管理対象に入れるかどうかはプロジェクト毎にメリデメを考慮した上で決めるべき
GitHubで編集を提案

Discussion