🗂
【Rails】Herokuへのデプロイ時にでたPrecompiling assets failedを解決する
発生したエラー
ある時、個人開発しているRailsアプリをHerokuにデプロイしようとした時のこと。
git push heroku main
したところ下記のエラーが発生した。
$ git push heroku main
Enumerating objects: 7, done.
Counting objects: 100% (7/7), done.
(省略)
remote: 358 | NODE_MODULE(binding, RegisterModule);
remote: | ^~~~~~~~~~~
remote: make: *** [binding.target.mk:133: Release/obj.target/binding/src/binding.o] Error 1
remote: gyp ERR! build error
remote: make: Leaving directory '/tmp/build_946b5370/node_modules/node-sass/build'
remote: gyp ERR! stack Error: `make` failed with exit code: 2
remote: gyp ERR! stack at ChildProcess.onExit (/tmp/build_946b5370/node_modules/node-gyp/lib/build.js:262:23)
remote: gyp ERR! stack at ChildProcess.emit (node:events:390:28)
remote: gyp ERR! stack at Process.ChildProcess._handle.onexit (node:internal/child_process:290:12)
remote: gyp ERR! System Linux 4.4.0-1104-aws
remote: gyp ERR! command "/tmp/build_946b5370/bin/node" "/tmp/build_946b5370/node_modules/node-gyp/bin/node-gyp.js" "rebuild" "--verbose" "--libsass_ext=" "--libsass_cflags=" "--libsass_ldflags=" "--libsass_library="
remote: gyp ERR! cwd /tmp/build_946b5370/node_modules/node-sass
remote: gyp ERR! node -v v16.13.1
remote: gyp ERR! node-gyp -v v3.8.0
remote: gyp ERR! not ok
remote: Build failed with error code: 1
remote:
remote: !
remote: ! Precompiling assets failed.
remote: !
remote: ! Push rejected, failed to compile Ruby app.
remote:
remote: ! Push failed
remote: Verifying deploy...
remote:
remote: ! Push rejected to { app_name }.
remote:
To https://git.heroku.com/{ app_name }.git
! [remote rejected] master -> master (pre-receive hook declined)
error: failed to push some refs to 'https://git.heroku.com/{ app_name }.git'
調査
Precompiling assets failed
、コンパイルが上手くいっていないと言われている。
以下の箇所が怪しいんじゃないかということで、gyp ERR! cwd /tmp/build_946b5370/node_modules/node-sass
で検索してみた。
remote: gyp ERR! cwd /tmp/build_946b5370/node_modules/node-sass
remote: gyp ERR! node -v v16.13.1
remote: gyp ERR! node-gyp -v v3.8.0
remote: gyp ERR! not ok
remote: Build failed with error code: 1
すると、以下の記事がヒットして、結果的にこちらを参考に解決することができた。
こちらによると、yarn why パッケージ名
でエラーの原因のパッケージ(今回はnode-sass
)が依存するパッケージを調べて、それをアップグレードすることで解決するらしい。
解決
- エラーの原因のパッケージが依存するパッケージを調べる(ローカルでDockerを使っているため、Dockerコマンドです)
$ docker-compose run web yarn why node-sass
yarn why v1.22.19
[1/4] Why do we have the module "node-sass"...?
[2/4] Initialising dependency graph...
[3/4] Finding dependency...
[4/4] Calculating file sizes...
=> Found "node-sass@4.14.1"
info Reasons this module exists
- "@rails#webpacker" depends on it
- Hoisted from "@rails#webpacker#node-sass"
info Disk size without dependencies: "6.45MB"
info Disk size with unique dependencies: "14.88MB"
info Disk size with transitive dependencies: "28.08MB"
info Number of shared dependencies: 81
Done in 5.78s.
@rails#webpacker
に依存するnode-sass
が原因でコンパイルが失敗していることがわかる
- 依存するパッケージのバージョンをアップグレードする
package.json
を編集
package.json
- "@rails/webpacker": "4.2.2",
+ "@rails/webpacker": "5.4.3",
GitHubにプッシュしておく
$ git add .
$ git commit -m "upgrade webpacker"
$ git push origin main
yarn install
(ローカルにDockerを使用しているので、dockerコマンドを使っています)
$ docker-compose run web yarn install
- Herokuにデプロイ
$ git push heroku main
無事にHerokuにデプロイできた!
参考
文中でも引用させていただきましたが、下記の記事を参考にさせていただきました。
ありがとうございます。
Discussion