ボクココ

個人開発に関するテックブログ

Heroku での npm バージョンの違いによるデプロイ失敗メモ

ども、@kimihom です。

f:id:cevid_cpp:20210425144408j:plain

急に Heroku での Node.js アプリのデプロイが失敗したので、その原因と(一次)対応について記しておく。

問題

いつも通り、git push heroku master でデプロイしたところ、以下のようなエラーが発生するようになった。

remote: -----> Installing binaries
remote:        engines.node (package.json):  15.x
remote:        engines.npm (package.json):   unspecified (use default)
remote:
remote:        Resolving node version 15.x...
remote:        Downloading and installing node 15.14.0...
remote:        Using default npm version: 7.7.6
remote:
remote: -----> Restoring cache
remote:        Cached directories were not restored due to a change in version of node, npm, yarn or stack
remote:        Module installation may take longer for this build
remote:
remote: -----> Installing dependencies
remote:        Installing node modules (package.json)
remote:        npm ERR! code ERESOLVE
remote:        npm ERR! ERESOLVE unable to resolve dependency tree
remote:        npm ERR!
remote:        npm ERR! While resolving: undefined@undefined
remote:        npm ERR! Found: bootstrap@3.4.1
remote:        npm ERR! node_modules/bootstrap
remote:        npm ERR!   bootstrap@"^3.3.7" from the root project

根本は bootstrap のバージョン指定? が定義されていない(undefined)ことのようだ。しかし、今まで問題なくデプロイできたのに、急にできなくなったのはなんでだろう?

対応

その答えが、npm のデフォルトバージョンが 7 に上がった ということだった。npm v7 に上がると、どうやら npm の dependency をインストールする際にバージョンチェックなどが走るようである。

取り急ぎ、すぐに7にあげる必要もまだないだろうし、問題なく動いている node 6 で動かすようにすることで解決できた。そのために、package.json に以下の記述をしている。

  "engines": {
    "node": "15.x",
    "npm": "6.x.x"
  }

これで Heroku にデプロイする際に npm 6 のバージョンでデプロイ準備してくれるため、正しく動くようになった。

Heroku キャッシュで動き続けることが

この問題、キャッシュで npm インストールが残っていたりすると、バージョン7でも問題なくデプロイできたみたいな複雑な問題となることがある。キャッシュの消し方については以下ページに記載があった。

How do I clear the build cache? - Heroku Help

テスト環境では動いたのに、本番で動かない!そんなことが起こらないようにしたいところである。

終わりに

もちろん、最新を追い続けるために、今後は npm 7 系でも問題なくインストールできるよう調整する必要はある。 あくまで一時的な対応方法として、本記事が参考になれば幸いである。