⚒️
package-lock.json と yarn.lock を両方コミットするとデプロイ時にエラーが出るので気をつけよう
メンバーから, heroku でデプロイに失敗するようになったという質問を受けて調べてみたら, heroku のログに以下のようなエラーが出ていました.
-----> Node.js app detected
-----> Build failed
! Two different lockfiles found: package-lock.json and yarn.lock
Both npm and yarn have created lockfiles for this application,
but only one can be used to install dependencies. Installing
dependencies using the wrong package manager can result in missing
packages or subtle bugs in production.
- To use npm to install your application's dependencies please delete
the yarn.lock file.
$ git rm yarn.lock
- To use yarn to install your application's dependences please delete
the package-lock.json file.
$ git rm package-lock.json
https://help.heroku.com/0KU2EM53
! Push rejected, failed to compile Node.js app.
! Push failed
エラーの内容は
lockfile が2種類あってどっち見れば良いかわかんないからどっちか消してね
的なことが書かれています.
どちらも依存モジュールのバージョンを固定するという同じ役割を担っているので混乱するのは当然ですよね.
実際にプロジェクトのログを見ると yarn.lock
があるにも関わらず, 途中で package-lock.json
がコミットされてしまっており, そのタイミングからエラーが出るようになっていました.
指摘の内容通り package-json.lock
もしくは yarn.lock
を git rm
してあげれば問題なく動くようになりました.
おそらく heroku に限らず PaaS 系のサービスはほとんど似たようなエラーが出ちゃうんじゃないかなと思います.
対策
まず, npm や yarn のどちらを使うかメンバーに委ねるのではなく package.json
に以下のようにかいて必ずセットアップ方法を1本化しました.
"scripts": {
"setup": "yarn",
...
}
その上で npm と yarn, どっちを使うか明確にしチームに共有した上でプロジェクト運用するようにしました.
参考になれば幸いです.
Discussion