【Rails】Herokuデプロイで「Could not detect rake tasks」エラーが出る問題への対処法

Railsで作成したアプリをHerokuにデプロイしようとしたところ、突如として以下のエラーが発生。

今回のエラーの要点をかいつまむと、

  • Could not detect rake tasks
  • LoadError: cannot load such file — matrix

となります。

色々とググって見つけた対処法を片っ端からやってみてもうまくいかずにかなり苦戦しましたが、

半日がかりでようやく解決できたので、忘れないうちにメモとして残しておこうと思います。

目次

開発環境

  • Ruby 3.1.2
  • Ruby on Rails 7.0.3
  • Bootstrap 5.1.3
  • M1 Macbook Air 2020
  • mac OS Monterey (ver. 12.4)
  • ターミナル bash (Rosetta 2 使用

Herokuにデプロイできない

エラー詳細

少し長くなりますが、$ git push heroku mainコマンドでデプロイ実行時に以下のようなエラーが吐き出されました。

Enumerating objects: 398, done.
Counting objects: 100% (398/398), done.
Delta compression using up to 8 threads
Compressing objects: 100% (294/294), done.
Writing objects: 100% (398/398), 9.35 MiB | 3.37 MiB/s, done.
Total 398 (delta 161), reused 210 (delta 70), pack-reused 0
remote: Compressing source files... done.
remote: Building source:
remote: 
remote: -----> Building on the Heroku-22 stack
remote: -----> Determining which buildpack to use for this app
remote:  !     Warning: Multiple default buildpacks reported the ability to handle this app. The first buildpack in the list below will be used.
remote: 			Detected buildpacks: Ruby,Node.js
remote: 			See https://devcenter.heroku.com/articles/buildpacks#buildpack-detect-order
remote: -----> Ruby app detected
remote: -----> Installing bundler 2.3.10
remote: -----> Removing BUNDLED WITH version in the Gemfile.lock
remote: -----> Compiling Ruby/Rails
remote: -----> Using Ruby version: ruby-3.1.2
remote: -----> Installing dependencies using bundler 2.3.10
remote:        Running: BUNDLE_WITHOUT='development:test' BUNDLE_PATH=vendor/bundle BUNDLE_BIN=vendor/bundle/bin BUNDLE_DEPLOYMENT=1 bundle install -j4

   (-------------- 中略 --------------)

remote:        Bundle complete! 22 Gemfile dependencies, 65 gems now installed.
remote:        Gems in the groups 'development' and 'test' were not installed.
remote:        Bundled gems are installed into `./vendor/bundle`
remote:        Bundle completed (24.15s)
remote:        Cleaning up the bundler cache.
remote: -----> Installing node-v16.13.1-linux-x64
remote: -----> Installing yarn-v1.22.17
remote: -----> Detecting rake tasks
remote: 
remote:  !
remote:  !     Could not detect rake tasks
remote:  !     ensure you can run `$ bundle exec rake -P` against your app
remote:  !     and using the production group of your Gemfile.
remote:  !     rake aborted!
remote:  !     LoadError: cannot load such file -- matrix
remote:  !     /tmp/build_8e9bf9da/vendor/bundle/ruby/3.1.0/gems/bootsnap-1.13.0/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:29:in `require'
remote:  !     /tmp/build_8e9bf9da/vendor/bundle/ruby/3.1.0/gems/prawn-2.4.0/lib/prawn/transformation_stack.rb:10:in `<main>'
remote:  !     /tmp/build_8e9bf9da/vendor/bundle/ruby/3.1.0/gems/prawn-2.4.0/lib/prawn.rb:67:in `require_relative'
remote:  !     /tmp/build_8e9bf9da/vendor/bundle/ruby/3.1.0/gems/prawn-2.4.0/lib/prawn.rb:67:in `<main>'
remote:  !     /tmp/build_8e9bf9da/vendor/bundle/ruby/3.1.0/gems/bootsnap-1.13.0/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:32:in `require'
remote:  !     /tmp/build_8e9bf9da/vendor/bundle/ruby/3.1.0/gems/bootsnap-1.13.0/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:32:in `require'
remote:  !     /tmp/build_8e9bf9da/vendor/bundle/ruby/3.1.0/gems/bundler-2.3.10/lib/bundler/runtime.rb:60:in `block (2 levels) in require'
remote:  !     /tmp/build_8e9bf9da/vendor/bundle/ruby/3.1.0/gems/bundler-2.3.10/lib/bundler/runtime.rb:55:in `each'
remote:  !     /tmp/build_8e9bf9da/vendor/bundle/ruby/3.1.0/gems/bundler-2.3.10/lib/bundler/runtime.rb:55:in `block in require'
remote:  !     /tmp/build_8e9bf9da/vendor/bundle/ruby/3.1.0/gems/bundler-2.3.10/lib/bundler/runtime.rb:44:in `each'
remote:  !     /tmp/build_8e9bf9da/vendor/bundle/ruby/3.1.0/gems/bundler-2.3.10/lib/bundler/runtime.rb:44:in `require'
remote:  !     /tmp/build_8e9bf9da/vendor/bundle/ruby/3.1.0/gems/bundler-2.3.10/lib/bundler.rb:176:in `require'
remote:  !     /tmp/build_8e9bf9da/config/application.rb:7:in `<main>'
remote:  !     /tmp/build_8e9bf9da/Rakefile:4:in `require_relative'
remote:  !     /tmp/build_8e9bf9da/Rakefile:4:in `<main>'
remote:  !     /tmp/build_8e9bf9da/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/rake_module.rb:29:in `load'
remote:  !     /tmp/build_8e9bf9da/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/rake_module.rb:29:in `load_rakefile'
remote:  !     /tmp/build_8e9bf9da/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/application.rb:710:in `raw_load_rakefile'
remote:  !     /tmp/build_8e9bf9da/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/application.rb:104:in `block in load_rakefile'
remote:  !     /tmp/build_8e9bf9da/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/application.rb:186:in `standard_exception_handling'
remote:  !     /tmp/build_8e9bf9da/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/application.rb:103:in `load_rakefile'
remote:  !     /tmp/build_8e9bf9da/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/application.rb:82:in `block in run'
remote:  !     /tmp/build_8e9bf9da/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/application.rb:186:in `standard_exception_handling'
remote:  !     /tmp/build_8e9bf9da/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/application.rb:80:in `run'
remote:  !     /tmp/build_8e9bf9da/bin/rake:4:in `<main>'
remote:  !
remote: /tmp/codon/tmp/buildpacks/50d5eddf222a9b7326028041d4e6509f915ccf2c/lib/language_pack/helpers/rake_runner.rb:100:in `load_rake_tasks!': Could not detect rake tasks (LanguagePack::Helpers::RakeRunner::CannotLoadRakefileError)
remote: ensure you can run `$ bundle exec rake -P` against your app
remote: and using the production group of your Gemfile.
remote: rake aborted!
remote: LoadError: cannot load such file -- matrix
remote: /tmp/build_8e9bf9da/vendor/bundle/ruby/3.1.0/gems/bootsnap-1.13.0/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:29:in `require'
remote: /tmp/build_8e9bf9da/vendor/bundle/ruby/3.1.0/gems/prawn-2.4.0/lib/prawn/transformation_stack.rb:10:in `<main>'
remote: /tmp/build_8e9bf9da/vendor/bundle/ruby/3.1.0/gems/prawn-2.4.0/lib/prawn.rb:67:in `require_relative'
remote: /tmp/build_8e9bf9da/vendor/bundle/ruby/3.1.0/gems/prawn-2.4.0/lib/prawn.rb:67:in `<main>'
remote: /tmp/build_8e9bf9da/vendor/bundle/ruby/3.1.0/gems/bootsnap-1.13.0/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:32:in `require'
remote: /tmp/build_8e9bf9da/vendor/bundle/ruby/3.1.0/gems/bootsnap-1.13.0/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:32:in `require'
remote: /tmp/build_8e9bf9da/vendor/bundle/ruby/3.1.0/gems/bundler-2.3.10/lib/bundler/runtime.rb:60:in `block (2 levels) in require'
remote: /tmp/build_8e9bf9da/vendor/bundle/ruby/3.1.0/gems/bundler-2.3.10/lib/bundler/runtime.rb:55:in `each'
remote: /tmp/build_8e9bf9da/vendor/bundle/ruby/3.1.0/gems/bundler-2.3.10/lib/bundler/runtime.rb:55:in `block in require'
remote: /tmp/build_8e9bf9da/vendor/bundle/ruby/3.1.0/gems/bundler-2.3.10/lib/bundler/runtime.rb:44:in `each'
remote: /tmp/build_8e9bf9da/vendor/bundle/ruby/3.1.0/gems/bundler-2.3.10/lib/bundler/runtime.rb:44:in `require'
remote: /tmp/build_8e9bf9da/vendor/bundle/ruby/3.1.0/gems/bundler-2.3.10/lib/bundler.rb:176:in `require'
remote: /tmp/build_8e9bf9da/config/application.rb:7:in `<main>'
remote: /tmp/build_8e9bf9da/Rakefile:4:in `require_relative'
remote: /tmp/build_8e9bf9da/Rakefile:4:in `<main>'
remote: /tmp/build_8e9bf9da/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/rake_module.rb:29:in `load'
remote: /tmp/build_8e9bf9da/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/rake_module.rb:29:in `load_rakefile'
remote: /tmp/build_8e9bf9da/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/application.rb:710:in `raw_load_rakefile'
remote: /tmp/build_8e9bf9da/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/application.rb:104:in `block in load_rakefile'
remote: /tmp/build_8e9bf9da/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/application.rb:186:in `standard_exception_handling'
remote: /tmp/build_8e9bf9da/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/application.rb:103:in `load_rakefile'
remote: /tmp/build_8e9bf9da/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/application.rb:82:in `block in run'
remote: /tmp/build_8e9bf9da/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/application.rb:186:in `standard_exception_handling'
remote: /tmp/build_8e9bf9da/vendor/bundle/ruby/3.1.0/gems/rake-13.0.6/lib/rake/application.rb:80:in `run'
remote: /tmp/build_8e9bf9da/bin/rake:4:in `<main>'
remote: 	from /tmp/codon/tmp/buildpacks/50d5eddf222a9b7326028041d4e6509f915ccf2c/lib/language_pack/ruby.rb:967:in `rake'
remote: 	from /tmp/codon/tmp/buildpacks/50d5eddf222a9b7326028041d4e6509f915ccf2c/lib/language_pack/rails4.rb:69:in `block in run_assets_precompile_rake_task'
remote: 	from /tmp/codon/tmp/buildpacks/50d5eddf222a9b7326028041d4e6509f915ccf2c/lib/language_pack/base.rb:175:in `log'
remote: 	from /tmp/codon/tmp/buildpacks/50d5eddf222a9b7326028041d4e6509f915ccf2c/lib/language_pack/rails4.rb:63:in `run_assets_precompile_rake_task'
remote: 	from /tmp/codon/tmp/buildpacks/50d5eddf222a9b7326028041d4e6509f915ccf2c/lib/language_pack/ruby.rb:103:in `block in compile'
remote: 	from /tmp/codon/tmp/buildpacks/50d5eddf222a9b7326028041d4e6509f915ccf2c/lib/language_pack/ruby.rb:988:in `allow_git'
remote: 	from /tmp/codon/tmp/buildpacks/50d5eddf222a9b7326028041d4e6509f915ccf2c/lib/language_pack/ruby.rb:96:in `compile'
remote: 	from /tmp/codon/tmp/buildpacks/50d5eddf222a9b7326028041d4e6509f915ccf2c/lib/language_pack/rails2.rb:55:in `compile'
remote: 	from /tmp/codon/tmp/buildpacks/50d5eddf222a9b7326028041d4e6509f915ccf2c/lib/language_pack/rails3.rb:37:in `compile'
remote: 	from /tmp/codon/tmp/buildpacks/50d5eddf222a9b7326028041d4e6509f915ccf2c/lib/language_pack/rails4.rb:30:in `compile'
remote: 	from /tmp/codon/tmp/buildpacks/50d5eddf222a9b7326028041d4e6509f915ccf2c/lib/language_pack/rails6.rb:17:in `compile'
remote: 	from /tmp/codon/tmp/buildpacks/50d5eddf222a9b7326028041d4e6509f915ccf2c/bin/support/ruby_compile:19:in `block in <main>'
remote: 	from /tmp/codon/tmp/buildpacks/50d5eddf222a9b7326028041d4e6509f915ccf2c/lib/language_pack/base.rb:175:in `log'
remote: 	from /tmp/codon/tmp/buildpacks/50d5eddf222a9b7326028041d4e6509f915ccf2c/bin/support/ruby_compile:18:in `<main>'
remote:  !     Push rejected, failed to compile Ruby app.
remote: 
remote:  !     Push failed
remote:  !
remote:  ! ## Warning - The same version of this code has already been built: 28a4d84499b22fec007d2fb175e5afccf13c21ca
remote:  !
remote:  ! We have detected that you have triggered a build from source code with version 28a4d84499b22fec007d2fb175e5afccf13c21ca
remote:  ! at least twice. One common cause of this behavior is attempting to deploy code from a different branch.
remote:  !
remote:  ! If you are developing on a branch and deploying via git you must run
remote:  !
remote:  !     git push heroku <branchname>:main
remote:  !
remote:  ! This article goes into details on the behavior:
remote:  !   https://devcenter.heroku.com/articles/duplicate-build-version
remote: 
remote: Verifying deploy....
remote: 
remote: !	Push rejected to tozan-plan.
remote: 
To https://git.heroku.com/tozan-plan.git
 ! [remote rejected] main -> main (pre-receive hook declined)
error: failed to push some refs to 'https://git.heroku.com/tozan-plan.git'

このエラーログから重要となりそうなエラー文は、

  • Could not detect rake tasks (rake tasksを検出できませんでした)
  • LoadError: cannot load such file — matrix (matrix ファイルを読み込めません)

この2つですね。

今まで、同じローカル環境でRailsのアプリを作成しherokuにデプロイしてきましたが、このようなエラーが発生したことはありません。

ただ、エラーの原因として思い当たる点が1つだけあります。

エラーの原因として考えられること

今回のエラーの原因として考えられるのは、

  • 作成したアプリはgit cloneで複製したため、
  • 内部的にはクローン元のオリジナルと同一と見なされてデプロイ時に弾かれる
  • もしくは、何らかのライブラリが抜け落ちているか、バージョンにずれがある

という可能性があります。

あわせて読みたい
【Rails7】git cloneしたプロジェクトをbin/devしても動かない時の対処法 Rails7で以下のコマンドを実行して作成されたプロジェクト(アプリ)を、Githubからローカル環境にcloneするとします。 $ rails new アプリ名 --css=bootstrap そのロー...

そして色々とググってみた結果、bundler gemのバージョンがずれている可能性が高いことがわかりました。

bundlerのバージョン合わせをやってみた結果…

$ git push heroku main を実行した後のログを見てみると、リモートでインストールされているbundlerのバージョンは2.3.10となっていました。

remote: -----> Installing bundler 2.3.10

続いて、Gemfile.lockを確認するとローカルのbundlerのバージョンは2.3.7

このbundlerのバージョンをローカルとリモート(Heroku側)で合わせる必要があるみたいですね。(少しでもバージョンが異なると動かないそうです)

そこで、まずはローカルにインストールされているbundlerをアンインストールし、リモートと同じバージョンのbundlerを再インストールします。

bundle exec gem uninstall bundler -v '2.3.7'
gem install bundler --version '2.3.10'

しかし、場合によってはbunlderを削除できないことがあります

Gem bundler-2.3.7 cannot be uninstalled because it is a default gem

もし、このようなエラーが出た場合はbundler-2.3.7.gemspecというファイルを削除してデフォルトgemの設定を解除する必要があります。

rm ~/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/specifications/default/bundler-2.3.7.gemspec
↓
bundle exec gem uninstall bundler -v '2.3.7'
gem install bundler --version '2.3.10'

これで、デフォルトだったbundlerをアンインストールできるようになるかと思います。

bundlerを再インストールしたら、以下のコマンドを順番に実行していきます。

rm Gemfile.lock
bundle install
bundle lock --add-platform x86_64-linux

最後に、以下のコマンドでデプロイ完了です。

git add .
git commit -m "コミットメッセージ"
git push heroku main

…と言いたいところですが、僕の場合はbundler合わせをしてもエラーを解消することができず…

どれだけググっても、解決策はbundlerのバージョン合わせの一択しかなかった(今思えば検索不足かもですが)ので、完全に詰みました。。。

【解決済み】エラーへの対処法

完全に詰んだと思っていましたが、以下の記事のおかげで無事に解決できました。

GitHub
Ruby 3.1: LoadError - cannot load such file -- matrix · Issue #81 · gdelugre/origami With ruby 3.1 Matrix is now a dedicated gem, see https://www.ruby-lang.org/en/news/2021/12/25/ruby-3-1-0-released/ As of this it needs to be added an explicit d...

僕の場合、今回はbundlerのバージョン相違というより、「LoadError: cannot load such file — matrix」のエラーが本命だったようです(たぶん)。

そこで、bundlerのバージョン合わせに加えて、matrixのgemを追加しました。

gem "matrix"

続けて、以下のコマンドを実行してデプロイを実行。

bundle install
git add .
git commit -m "コミットメッセージ"
git push heroku main

そしたら、見事デプロイに成功しました。

とりあえず、めでたしめでたし。

以上、また何か別の問題が発生した場合は追記します。

参考資料

GitHub
Ruby 3.1: LoadError - cannot load such file -- matrix · Issue #81 · gdelugre/origami With ruby 3.1 Matrix is now a dedicated gem, see https://www.ruby-lang.org/en/news/2021/12/25/ruby-3-1-0-released/ As of this it needs to be added an explicit d...
Stack Overflow
Rails rake issue when deploying to Heroku SOLUTION: I was running ruby 2.6.6p146 with Bundler version 2.2.4. As per @thiebo's suggestion, I downgraded to Bundler 2.1.2 and it worked! Steps: $ gem uninst...
スタック・オーバーフロー
Herokuにデプロイできなくなりました 前提・実現したいこと Ruby on Railsを使ってアプリを開発していた際にgithubを通してHerokuにデプロイしていたのですが,ある時誤まってherokuのappを消してしまいました...
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

愛知の34歳。無職で暇になり始めたプログラミング(Ruby on Rails)の忘備録をまとめたブログです。最近は別にやりたいことができたのでプログラミングほぼやっていません。気が向いたらまた再開するかも。僕の日常はメインブログの方で更新しています。

コメント

コメントする

目次