Rails7にしたあとRuby3.1 + Yjit & Rails7.0.2にアップグレードする

このシリーズも区切りになりそう。

次はRubyを3.1 + Yjitにして、Railsも7.0.2がでたのでアップグレードする。

7.0.2についてはtechrachoさんが書いてくれているので参照してほしい。

公式より日本語のほうがいい。

Railsのアップグレード

まずはRailsのバージョンを変更

gem 'puma', '~> 4.1'
gem 'rails', '7.0.2' <--- 7.0.0だった
gem 'sass-rails', '>= 6'

bundle

$ bundle update rails

個人プロダクトだし最新版なのでそのままbundle updateしてもいいんだけど、まあ一応念のため。

Rubyのアップグレード

RubyはDockerに3.1.0-alpineが出ているので使わせてもらう。

Dockerfileの頭にあるイメージ名を書き換える。

FROM ruby:3.1.0-alpine <---これ
ENV ROOT="/app"
ENV LANG=C.UTF-8
ENV TZ=Asia/Tokyo

次にdocker-compose.ymlか手元の.envファイルとかにYJIT有効にする環境変数を付け足す

RUBY_YJIT_ENABLE=1

これで設定は終わり。

起動

このままdocker-compose down -> docker-compose upしてもいいんだけど、僕の場合こんなエラーがでた。

<internal:/usr/local/lib/ruby/3.1.0/rubygems/core_ext/kernel_require.rb>:85:in `require': Error loading shared library libruby.so.3.0: No such file or directory (needed by /usr/local/bundle/gems/io-wait-0.2.1/lib/io/wait.so) - /usr/local/bundle/gems/io-wait-0.2.1/lib/io/wait.so (LoadError)

このエラーがいまいち要領を得なくてようわからない。調べてもいまいちぴんとこない。

解決方法にいたってはgem pristineしてみても解決しなかった。

gem pristine --all

なのでRuby3.0の時に使っていた関連するDocker Imageを削除してから新しく起動するという力技で解決したわけなんだが、当然なんの解決にもなってなくて自分でよくわからないでいま終わっているので、有識者いたら教えて欲しい。

起動してるししばらくは調査の優先度は低い。再現しないし。

おわり

長かったけど一旦手元のアプリをRuby3.1 + YJITとRails7.0.2にすることができた。

importmapとlibruby.so.3.0で二週間くらい悩んだけど、それがなければ3日位でいけると思う。

Rails8にするときは少し楽であって欲しい。