⚒️

package-lock.json と yarn.lock を両方コミットするとデプロイ時にエラーが出るので気をつけよう

2021/01/04に公開

メンバーから, 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.lockgit rm してあげれば問題なく動くようになりました.
おそらく heroku に限らず PaaS 系のサービスはほとんど似たようなエラーが出ちゃうんじゃないかなと思います.

対策

まず, npm や yarn のどちらを使うかメンバーに委ねるのではなく package.json に以下のようにかいて必ずセットアップ方法を1本化しました.

  "scripts": {
    "setup": "yarn",
    ...
  }

その上で npm と yarn, どっちを使うか明確にしチームに共有した上でプロジェクト運用するようにしました.

参考になれば幸いです.

Discussion