RailsをHerokuへPushした際に「Could not detect rake tasks」「Gem::MissingSpecError」のエラーが出た時の対処について

どうも、RailsアプリをHerokuにアップしようとした際に、エラーが発生しました。今回はエラーの解決方法について簡単にまとめておきたいと思います。

あの有名なbundler versionによって引き起こされるエラーとは別のエラーなのでご注意ください。

RailsをHerokuへPushした際に「Could not detect rake tasks」「Gem::MissingSpecError」のエラーが出た時の対処について

結論

Gemfileからspringとspring-commands-railsを削除して、bundle installで解決。

Gemfile
group :development do
・・・省略・・・
  # gem 'spring' → springをコメントアウト
  # gem 'spring-commands-rspec' → spring-commands-rspecをコメントアウト
end

teratailのRailsアプリをHerokuにデプロイできない(rake taskが検出できない問題)でも同じエラーが出てます。

環境

 

Ruby 3.0.0
Rails 6.1.1
Bundler 2.1.4

 

エラーコード

発生したエラーコード
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にアップしようとするとエラーが起こります。

MEMO

しっかりと確認してませんが、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

簡単に説明すると以下のようなことになっているようです。

  1. Rails6.0の時は動いていたけど、Rails6.1になったタイミングでbin/rspecのようなbin/*系の動作ができなくなった。
  2. エラーがSpring Gem::MissingSpecErrorが原因で失敗。
  3. Railsの変更により前はbin/rails、bin/rakeに含まれていたguard句が削除されている。
  4. 発生したLoadErrorをrescueするguard句をbin/springに追加した結果、正常に動作。

と言うことで終わってましたが、結論よくわからずです。結局、Railsのソースコードにはguard句が導入されている感じでしたが…。

Leave a Reply

Your email address will not be published.

CAPTCHA