yarnとnpmの違い【 yarn installとnpm ciの比較】
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時にチーム内で同じバージョンが保たれるということになります。
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の日本語ドキュメントです。
英語の公式ドキュメントと比較すると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 installがnpm ciの役割まで担っている。)
まとめると
yarnを使用しているプロジェクトではyarn.lockをリモートリポジトリにアップして、メンバーはyarn installを実行するで良さそうです。
Discussion