memorandums

日々の生活で問題解決したこと、知ってよかったことなどを自分が思い出すために記録しています。

Rails5.2.8のアプリを8.0.2にアップグレードした話

授業支援ツールをRailsで作成したのが2, 3年くらい前でした。

当時はまだ授業でもRails5を使っていたので5.2で作っていました。

今年もRailsの授業回が近づいたのでそのツールを動かそうとRender.com(無料枠)にデプロイしようとしたところ、Ruby3.1.0以上じゃないとダメとかエラーが出ました。このツールは2.7.5でした。外部要因でソフトウェアを追従させなければならないやつです。

で、以下、操作ログです。

ちなみにそのツールはデフォルトで入っているものを除けばgemはほとんど使っていません。データベースを使うためposgreくらいです。

Railsをアップグレードした記憶がなく、授業まで時間がないなか危険と思い、とりあえずRubyだけアップしようとしました。

この記事があって、Rubyだけアップができそうだったのでやり始めました。

RailsプロジェクトのRubyのバージョンをアップします。具体的には .ruby-version を3.2.2 に、 Gemfile を ruby '3.2.2' にしました。

で、 bundle update を実行しました。

すると、以下の記事と同じエラーがでたので。

Calling `DidYouMean::SPELL_CHECKERS.merge!(error_name => spell_checker)' has been deprecated. Please call `DidYouMean.correct_error(error_name, spell_checker)' instead.を解決する話。(Mac railsコマンド等で出る) #Ruby - Qiita

その記事にしたがって以下を実行しました。

bundle update --bundler
bundle update

すると今度は以下のエラーがでました。

(省略)static.rb:111:in `initialize': wrong number of arguments (given 3, expected 2) (ArgumentError)

以下によると Rails5.2 は Ruby3 に対応していないとか。。。だよね。

Upgrade causing error: ArgumentError: wrong number of arguments (given 3, expected 2) · Issue #46176 · rails/rails · GitHub

Gemfile のRailsのバージョンを 8.0.2 に書き換えて bundle install しました。幸いなことにエラーは出ませんでした(ワーニングは selenium で1件のみ出た)

とりあえずエラーがなかったので、 rails s を実行しました。

すると、以下のエラーが出ました。

bundler-2.6.9/lib/bundler/rubygems_integration.rb:215:in `block (2 levels) in replace_gem': can't activate listen (~> 3.5), already activated listen-3.0.8. Make sure all dependencies are added to Gemfile. (Gem::LoadError)

いわれたとおり Gemfile の以下を書き換えました。

gem 'listen', '>= 3.5'
#gem 'listen', '>= 3.0.5', '< 3.2'

ここまでの変更で、ローカルではエラーなく動作しました。

つづいて、git pushして Render にデプロイするとなぜかビルドは成功しました。

アプリにアクセスするとエラー例外発生。。。

みると Caused by: Uglifier::Error というエラーでした。

以下の対処方法を実行すると動作しました。

【Rails】uglifierはterserに置き換えた方がいいかもな話 #ECMAScript - Qiita

よくわからないで変更しているのも非常に気持ち悪いですが。。。とりあえず動いていたアプリを動かすためにエラーが出るたびに修正していきました。通っていない実行パスもあるでしょうから完全に動いたとは言い切れませんが。

とりあえず本日の演習でも使えたようです。

使用しているgemなどによって難易度は大きく変わると思いますが、とりあえずそういう制約が少なければ意外と簡単に以降できるなと思いました。

以上です。