ども、@kimihom です。
急に 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 系でも問題なくインストールできるよう調整する必要はある。 あくまで一時的な対応方法として、本記事が参考になれば幸いである。