概要
本件は過去記事2つの流れで、
Herokuにデプロイが完了し、% heroku run db:migrate
実施後本番環境での動作は確認したが、なぜか突如ローカルサーバーが立ち上がらなくなった話です。
【過去記事】
Herokuへのデプロイができないエラー:Failed to install gems via Bundler. の改善。
Herokuへのデプロイができないエラー:Could not detect rake tasks の改善。
おそらくこの段階で何かしらの環境構築が変更されたのでしょうか。ということが大前提にあります。
!注意!
この解決には sudoコマンド
を用います。
sudoコマンド・・・端的にいうと権限者を駆使した強行突破コマンド(この認識に間違いがあるという有識者の方遠慮なくご指摘いただけますと幸いです。)
自己責任での実施をお願いいたします。
経緯
railsアプリケーションのデプロイに成功しました。
そこでローカルサーバーでの動作確認を行おうと、
% rails s
でローカルサーバーを立ち上げると、
Could not find 'bundler' (2.1.4) required by your /Users/アプリケーションのディレクトリ/Gemfile.lock. (Gem::GemNotFoundException)
To update to the latest version installed on your system, run `bundle update --bundler`.
とエラーが発生し、サーバーが立ち上がりません。
せっかくデプロイまで完了したのにこの時点で涙目です。
ちなみにこのエラー、
「Gemfile.lockにbundlerの記述が指定されてるけど、そんなものないで?」
といったニュアンスのものです。
しかしながら、% bundler -v
を実行すると、
Bundler version 2.1.4
と確かにあります。% gem list | grep bundler
を実行しても、
bundler 2.1.4
確かにありますよね!?
仮説と試したこと
①bundle update
エラー文に則り、bundle update --bundler
を試してみましたが、だめでした。
②Gemfile.lock削除。bundler2.1.4再インストール
ダメでした。
ここでGitを確認してみると、changes
に何も反映されていませんでした。
あれれ、おかしいな・・・?
普通であればGemfile.lockが再構築されたのがコミットできるものだと思いましたが・・・。
解決方法
アプリケーションの他のファイルを操作すると、確かにGitのchanges
には反映されています。
となると、gemのインストール先がおかしいのでは、という仮設に至りました。
% bundle install
実施後に最後に緑文字でこのような文面が現れています。
Bundled gems are installed into `./vendor/bundle`
vendor
というディレクトリに、インストールされたGem達が格納されてい流のがわかります。
**アプリケーションで読み込むBundler(Gem)が、違う場所に格納されているのでは?**という仮説が上がりました。
となると、どれだけbundle installしても同じようなエラーは出るだろうし、Gitのchanges
にも反映されないのもこれのせいかもしれません。
そこでbundlerを管理も司るrbenv
を再インストールすれば、あるいは・・・という仮説を教えていただきました。
rbenv
についてはこちらの記事が参考になりました。
rbenvの役割
では、実践です.
% sudo cd . &&
brew uninstall rbenv ; #rbenvのアンインストール
sudo rm -rf ~/.rbenv ; #.rbenvファイルの削除
brew install rbenv ; #Homebrewを用いてrbenvインストール
rbenv rehash ; #rbenvリハッシュ
rbenv install 2.6.5 -v ; #rbenv2.6.5インストール
rbenv global 2.6.5 ; #環境全体のRubyバージョンを指定
rbenv rehash ; #rbenvリハッシュ
gem install bundler ; #bundlerインストール
rbenv rehash ; #rbenvリハッシュ
gem install rails -v 6.0.0 ; #rails6.0.0インストール
rbenv rehash ; #rbenvリ(以下略
rm -rf ~/.bundle/config ; #configファイル削除
rm -rf .bundle/config ; #同上
bundle config --global build.mysql2 --with-opt-dir="$(brew --prefix openssl)" ; #OpenSSLにmysql2を格納??ちょとうまく説明できませんすみません・・・。
これを実行するとパソコンのパスワードが求められます。
それを打ち込むと処理が始まります。(結構長いです。)
終了後、% bundle install
実行後に再度サーバーを立ち上げると、
解消されました!!
ローカル環境でもアプリは問題なく動いているようです。
考察
最後に% which bundler
で場所を確認してみると、
/Users/ユーザー名/.rbenv/shims/bundler
と、shims
というところに格納されているみたいですね。
ざっくりと考えると
rbenv<bundler<gem
といったように、gemを一元管理しているのがbundler
でさらにそれを管理しているのがrbenv(厳密にrbenvが管理しているのはrubyバージョン切り替えなど?)ということですかね。
bundlerとは何か、改めて調べるとこちらの記事が参考になりました。
【Rails】結局bundlerって何?bundlerの仕組みを図解形式で徹底解説
gemがおかしいならbundler入れ直すなどしてエラー解消に努めて、
bundlerがおかしいのであれば、最終手段としてrbenvを入れ直す。
そんな考え方もあるというのが今回大きな収穫になりました。
正直初学者の私にとってsudoコマンドはあまり使いたくないのですが・・・(笑)
ただ今回の件は私自身かなり勉強になりました。
本当にエラーは腹立つけど楽しいですね。