どうも、RailsアプリをHerokuにアップしようとした際に、エラーが発生しました。今回はエラーの解決方法について簡単にまとめておきたいと思います。
あの有名なbundler versionによって引き起こされるエラーとは別のエラーなのでご注意ください。
RailsをHerokuへPushした際に「Could not detect rake tasks」「Gem::MissingSpecError」のエラーが出た時の対処について
結論
Gemfileからspringとspring-commands-railsを削除して、bundle installで解決。
group :development do
・・・省略・・・
# gem 'spring' → springをコメントアウト
# gem 'spring-commands-rspec' → spring-commands-rspecをコメントアウト
end
teratailのRailsアプリをHerokuにデプロイできない(rake taskが検出できない問題)でも同じエラーが出てます。
環境
エラーコード
Could not detect rake tasks
ensure you can run `$ bundle exec rake -P` against your app
and using the production group of your Gemfile.
/tmp/build_fc777bfb/vendor/ruby-3.0.0/lib/ruby/3.0.0/rubygems/dependency.rb:307:in `to_specs': Could not find 'spring' (= 2.1.1) among 136 total gem(s) (Gem::MissingSpecError)
Checked in 'GEM_PATH=/tmp/build_fc777bfb/vendor/bundle/ruby/3.0.0' , execute `gem env` for more information
from /tmp/build_fc777bfb/vendor/ruby-3.0.0/lib/ruby/3.0.0/rubygems/dependency.rb:319:in `to_spec'
from /tmp/build_fc777bfb/vendor/ruby-3.0.0/lib/ruby/3.0.0/rubygems/core_ext/kernel_gem.rb:62:in `gem'
from /tmp/build_fc777bfb/bin/spring:14:in `'
from /tmp/build_fc777bfb/bin/rake:2:in `load'
エラーハンドリング
エラー内容的には「Gemの中にspringが見つからないよ!」と言ってます。なのでspring関連のgemを削除すればいいんじゃないかと言うことで削除した結果、動いたと言う感じです。
ローカルではうまく動いてるんですが、herokuにアップしようとするとエラーが起こります。
しっかりと確認してませんが、spring-commands-rspecでbinstubをインストールしてから、エラーが起こったように思います。springだけのgemならherokuにアップできてました。
なのでエラー回避したい場合は、spring-commands-rspecは導入しない方向で行ったほうがいいかもしれません。
エラーについての議論
この問題stackoverflowにて議論されています。下記参照してください。
Gem::MissingSpecError for Spring in Heroku CI environment after updating to 6.1 #40911
簡単に説明すると以下のようなことになっているようです。
- Rails6.0の時は動いていたけど、Rails6.1になったタイミングでbin/rspecのようなbin/*系の動作ができなくなった。
- エラーが
Spring Gem::MissingSpecError
が原因で失敗。 - Railsの変更により前はbin/rails、bin/rakeに含まれていたguard句が削除されている。
- 発生したLoadErrorをrescueするguard句をbin/springに追加した結果、正常に動作。
と言うことで終わってましたが、結論よくわからずです。結局、Railsのソースコードにはguard句が導入されている感じでしたが…。