🐈

yarnとnpmの違い【 yarn installとnpm ciの比較】

2023/08/27に公開

yarnを使用してプロジェクトを進めてる時に、
「あれ、npmの時はnpm installしないでnpm ciを使えって言われたよな、、」
と思い、さらに
「あれ、yarnの時はyarn ciみたいなコマンド打たなくていいのかな??」
とも思ったのでメモがてら書いてみました。

yarn installを実行したとき

yarn installを実行した場合は下記の条件分岐があります。

yarn.lockがない場合

yarn.lockがない、つまりpackage.jsonのみがプロジェクトにある場合はpackage.jsonを参照してnode_modulesを作り上げます。

yarn.lockがある場合

yarn.lockがある場合にyarn installを実行するとpackage.jsonではなくyarn.lockを参照してnode_modulesを作り上げます。
この挙動はnpmで言うところのnpm ciと同じ挙動となります。
そのため、yarn.lockがあればyarn install時にチーム内で同じバージョンが保たれるということになります。
https://classic.yarnpkg.com/lang/en/docs/cli/install/#toc-yarn-install

yarn.lockがない場合の問題点

上記にもある通り、lockファイル(yarn.lock)がない場合には毎回package.jsonを参照します。
ここで、package.json内のdependenciesやdevDependencies内にあるパッケージのバージョンをよく見てみてください。
例えば、"nuxt": "^3.1.0"のようにバージョンの数字の手前に^という記号が入っていたりします。
この^というのはそのメジャーバージョン(今回だったら3)の中で最新のバージョンをインストールするという意味です。
つまり"nuxt": "^3.1.0"と書かれている場合は^3.x.x系の最新のバージョンをインストールすることになります。
例えば、現時点ではnuxtの最新バージョンはv3.6.5です。(2023/08/11時点)
その場合、"nuxt": "^3.1.0"と記述があっても実際にインストールされるのは^3.x.x系の最新である"nuxt": "3.6.5"なんです。
そのため、yarn.lockがリモートリポジトリに入っていないとチームメンバー内で使用しているパッケージのバージョン違いが起こる可能性があるということです。
ですので、yarn.lockは必ずpushし共有するようにしましょう。

npmとの比較

npm installは常にpackage.jsonを参照し、そのため開発環境間でのバージョンのずれが生じる可能性があります。これを防ぐためにnpm ciが推奨され、これはpackage-lock.jsonを参照します。一方、yarnはyarn.lockが存在する場合、それを優先的に参照します。そのため、yarn\ではnpm ci`に相当する別のコマンドを使用する必要はありません。

yarnの日本語ドキュメントの落とし穴

下記がyarnの日本語ドキュメントです。
https://chore-update--yarnpkg.netlify.app/ja/docs/cli/install#toc-yarn-install
英語の公式ドキュメントと比較するとyarn.lockがある場合の記載がないのです。 これが、勘違いを生んでいると思われます。
これだけを見ると、yarn installを実行した場合は毎回package.jsonを参照するかのような記述になってます。しかし、上記にも書いたようにそのような挙動はせずにyarn.lockがあったらしっかりとyarn.lockを参照してパッケージをインストールします。

yarn install --frozen-lockfileについて

yarnのnpm ciに相当するコマンドと調べていると、yarn install --frozen-lockfileというのが出てきます。
ただこれはyarn.lockを生成しないだけで、特段npm ciに相当するコマンドではなさそうです。(というよりyarn installnpm ciの役割まで担っている。)

まとめると

yarnを使用しているプロジェクトではyarn.lockをリモートリポジトリにアップして、メンバーはyarn installを実行するで良さそうです。

GitHubで編集を提案

Discussion