3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【Rails】bundle updateは、慎重に。

Last updated at Posted at 2021-05-19

1.背景

共同開発中にエラーに遭遇し、原因を調べていると「導入したgemのバージョンが古いため
エラーが出ている可能性がある」とのことでした。
「そんな時は、gemのアップデートをするためにbundle updateをするといいよ!」と、とある記事を見つけてbundle updateを実行してしまいました:scream:

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.エラーの原因

とても単純なもので、②のヘルパーメソッドのスペルミスでした。:tired_face:
rails g helper 〇〇(今回は例としてsample)コマンドでヘルパーメソッドを作成すると、該当のファイルが作成されます。

app/helpers/sammple_helper.rb
# デフォルトで挿入される
module SammpleHelper
end

途中で、sampleのスペルがsammpleとなっていることに気づきます。
私「スペルミスだ。ファイル名変更しよう:sweat_smile:
しかし、moduleの後のSammpleHelperを修正せず実装を行なったので、エラーが表示されてしまったのでした。
エラー文に従い、bin/springbin/railsを探すなどしていたので、全然見当違いでした:sob:

5.bundle updateによる影響

エラー解決できて一見落着なのですが、当初「gemのバージョンのせいかも」と疑っていた私はgemの再インストールなどを試みていました。
今なら、バージョン指定せずにgemを導入しているので(※バージョン指定しない場合は最新版がインストールされる)、おかしいことは分かるのですが、エラーをどうにかしたくていろんな記事を参考に必死でした。

そして、bundle updateを行いました。
※gemとbundleについて→こちらでまとめています。
bundle updateを行うとバージョンアップできるgemが更新されて、Gemfile.lockに新しいバージョンの情報が書き込まれます。gemのバージョンが古いかもしれないという疑念は払拭されますが、バージョンアップするとアプリケーションがうまく動作しない恐れがあります。
該当のプロジェクトで約15行ほど更新されたのを見て、「やっちゃいけないやつだ...」と青ざめてしまいました。

Gemfile.lock
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.最後に

記事の感想や意見、ご指摘等あれば伝えていただけるとありがたいです。
読んでいただき、ありがとうございました。

3
1
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?