1.背景
共同開発中にエラーに遭遇し、原因を調べていると「導入したgemのバージョンが古いため
エラーが出ている可能性がある」とのことでした。
「そんな時は、gemのアップデートをするためにbundle update
をするといいよ!」と、とある記事を見つけてbundle update
を実行してしまいました
2.使用環境
- mac.os バージョン10.15.6
- Ruby 2.7.2
- Rails 6.1.3.1
- psql (PostgreSQL) 12.6
3.今回のエラーはこちら
rails s
でサーバーを起動しようとしたところ、下記のエラーが表示されました。
team_project % rails s
=> Booting Puma
=> Rails 6.1.3.1 application starting in development
=> Run `bin/rails server --help` for more startup options
Exiting
You've tried to invoke Spring when it's already loaded (i.e. the Spring constant is defined).
This is probably because you generated binstubs with Spring 1.0, and you now have a Spring version > 1.0 on your system. To solve this, upgrade your bundle to the latest Spring version and then run `bundle exec spring binstub --all` to regenerate your binstubs. This is a one-time step necessary to upgrade from 1.0 to 1.1.
Here's the backtrace:
/Users/ユーザー名/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/bootsnap-1.7.3/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:59:in `load'
/Users/ユーザー名/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/bootsnap-1.7.3/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:59:in `load'
/Users/ユーザー名/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/activesupport-6.1.3.1/lib/active_support/dependencies.rb:326:in `block in load'
/Users/ユーザー名/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/activesupport-6.1.3.1/lib/active_support/dependencies.rb:299:in `load_dependency'
/Users/ユーザー名/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/activesupport-6.1.3.1/lib/active_support/dependencies.rb:326:in `load'
/Users/ユーザー名/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/spring-2.1.1/lib/spring/binstub.rb:11:in `<main>'
/Users/ユーザー名/.rbenv/versions/2.7.2/lib/ruby/2.7.0/rubygems/core_ext/kernel_require.rb:92:in `require'
/Users/ユーザー名/.rbenv/versions/2.7.2/lib/ruby/2.7.0/rubygems/core_ext/kernel_require.rb:92:in `require'
/Users/ユーザー名/rails/team_project_48/bin/spring:10:in `block in <top (required)>'
/Users/ユーザー名/rails/team_project/bin/spring:7:in `tap'
/Users/ユーザー名/rails/team_project/bin/spring:7:in `<top (required)>'
bin/rails:2:in `load'
bin/rails:2:in `<main>'
背景としては、
①gemを導入してbundle install
②ヘルパーメソッドを作成してビューを実装する(ビューにヘルパーメソッドを組み込む)
③rails s
をするとサーバーが起動せずエラーが表示される
状態でした。
4.エラーの原因
とても単純なもので、②のヘルパーメソッドのスペルミスでした。
rails g helper 〇〇(今回は例としてsample)
コマンドでヘルパーメソッドを作成すると、該当のファイルが作成されます。
# デフォルトで挿入される
module SammpleHelper
end
途中で、sampleのスペルがsammpleとなっていることに気づきます。
私「スペルミスだ。ファイル名変更しよう」
しかし、moduleの後のSammpleHelper
を修正せず実装を行なったので、エラーが表示されてしまったのでした。
エラー文に従い、bin/spring
やbin/rails
を探すなどしていたので、全然見当違いでした
5.bundle updateによる影響
エラー解決できて一見落着なのですが、当初「gemのバージョンのせいかも」と疑っていた私はgemの再インストールなどを試みていました。
今なら、バージョン指定せずにgemを導入しているので(※バージョン指定しない場合は最新版がインストールされる)、おかしいことは分かるのですが、エラーをどうにかしたくていろんな記事を参考に必死でした。
そして、bundle update
を行いました。
※gemとbundleについて→こちらでまとめています。
bundle update
を行うとバージョンアップできるgemが更新されて、Gemfile.lock
に新しいバージョンの情報が書き込まれます。gemのバージョンが古いかもしれないという疑念は払拭されますが、バージョンアップするとアプリケーションがうまく動作しない恐れがあります。
該当のプロジェクトで約15行ほど更新されたのを見て、「やっちゃいけないやつだ...」と青ざめてしまいました。
team_project % bundle update
The dependency tzinfo-data (>= 0) will be unused by any of the platforms Bundler is installing for. Bundler is installing for ruby but the dependency is only for x86-mingw32, x86-mswin32, x64-mingw32, java. To add those platforms to the bundle, run `bundle lock --add-platform x86-mingw32 x86-mswin32 x64-mingw32 java`.
Fetching gem metadata from https://rubygems.org/............
Fetching gem metadata from https://rubygems.org/.
Resolving dependencies.....
Using rake 13.0.3
Using concurrent-ruby 1.1.8
Using i18n 1.8.10
Using minitest 5.14.4
Using tzinfo 2.0.4
Using zeitwerk 2.4.2
Using activesupport 6.1.3.2 (was 6.1.3.1) # 更新されたものはこのように表示される
...
最終的に、ログを参照しGemfile.lock
を元に戻してから bundle install
を行い、コンフリクトを解消してダウンデートを行う形でバージョンを元に戻しました。他にも一時的措置でgemのバージョンを戻す方法として、Gemfileで前バージョンに固定する記述を行い、再度 bundle update
を実行するというものがあります。
一斉に更新されてしまうため、本当に怖かったです。もしバージョンアップしたい場合は慎重に行い、バージョンアップ後は内容が妥当なのか調査する必要があると感じました。
6.まとめ
お世話になっているメンターの方にも「やってはいけないという認識で良いと思う」と違う意味でお墨付きを頂いてしまいました。「その処理は行う本当に必要があるのか?」「どこにどのような影響が出るか?」しっかり考えてから行なっていきたいと思いました。
7.参考
1.書籍:大場寧子他, 現場で使えるRuby on Rails5速修実践ガイド, マイナビ出版, 2018.
2.web:You've tried to invoke Spring when it's already loaded・・・ となり、rails sが出来なくなったときの対処法
3.web:知っておきたいヘルパーメソッド
4.web:rails sできない
5.web:#Rails の bundle install と bundle update の違いを結論から書く
8.最後に
記事の感想や意見、ご指摘等あれば伝えていただけるとありがたいです。
読んでいただき、ありがとうございました。