Rails5からRails6へのアップデートメモ
今更ですが、rails4からrails7までアップデートする必要があったため
Rails4→Rails5
Rails5→Rails6
Rails6→Rails7
のアップデートで手順をまとめていきます。
ここではRails5→Rails6の手順を書いていきます。
事前準備
testが通るようにしておく
testを通るようにしておくと、アップデート後に、どこがエラーになるのか確認しやすいです。
事前にtestが全て通るようにしておきましょう。
Ruby Version
今回はRuby 2.7.5 で対応してます
gccのバージョンを確認しておく
mini_racerをインストールするためには、gcc6.3以上が必要になってきます。
今回centos7にはyum installで新しいバージョンを入れられなかったため
devtoolsetを使用してインストールしました。
詳細は後ほど記載します。
Railsをアップデート
gemfileの修正
gemのrailsのバージョンを変更する
変更前
gem 'rails', '5.2.6.2'
変更前
gem 'rails', '6.1.4.7'
railsのupdate
下記コマンドを実行してrailsをupdateします
bundle update rails
設定ファイル更新
以下のコマンドを実行して、Railsの設定ファイル等を更新します。
bundle exec rails app:update
問題なければ上書きして良いでが、
必ず差分を見ながら更新していきましょう。
bundle update
bundle updateを実行して
gemファイルの依存関係などでエラーがある場合は修正しておきます。
今回、therubyracerが更新されなくなっていたので
mini_racerに変更しました。
bundle update
修正前
gem 'therubyracer', platforms: :ruby
修正後
gem 'mini_racer', '0.3.1', platforms: :ruby
dalli_storeからmem_cache_storeに変更
:dalli_store が使えなくなったので :mem_cache_store を使うように修正
/config/environments/* の各ファイル
dali_store の読み込み箇所をコメントアウト
#require 'action_dispatch/middleware/session/dalli_store'
修正前
config.cache_store = :dalli_store
修正後
config.cache_store = :mem_cache_store
DEPRECATION WARNING関連の修正
DEPRECATION WARNING: Initialization autoloaded the constants が出てしまうので修正
/config/initializers/requirements.rb
修正前
Dir[Rails.root.join("app/models/**/*.rb")].sort.each { |f| require_dependency f }
修正後
Rails.application.config.after_initialize do
Dir[Rails.root.join("app/models/**/*.rb")].sort.each { |f| require_dependency f }
end
/config/initializers/current_revision_loader.rb
修正前
ToUtil::Log::Revision.load_current_revision
修正後
Rails.application.config.after_initialize do
ToUtil::Log::Revision.load_current_revision
end
DEPRECATION WARNING: Calling <<
to an ActiveModel::Errors message array in order to add an error is deprecated. Please call ActiveModel::Errors#add
instead.
を修正
修正前
record.errors[attribute] << I18n.t('activerecord.errors.validate_error') unless ret
修正後
record.errors.add attribute, I18n.t('activerecord.errors.validate_error') unless ret
zeitwerkの導入
autoloader を zeitwerk に変更
rails7からはzeitwerkになるため、今回変更しておきました。
/config/application.rb
変更前
config.paths.add 'lib', eager_load: true
config.paths.add 'lib/ext', eager_load: true
config.paths.add 'app/validators', eager_load: true
変更後
config.autoloader = :zeitwerk
# 自動で読み込みたいファイルをlib/autoloder以下に設置
config.eager_load_paths << Rails.root.join("lib/autoloder")
zeitwerk はファイル名からクラス名を生成しているので、
命名規則に沿っていないとエラーになります。
下記コマンドを実行して、命名規則エラーがないかチェックし、
エラーがある場合は修正します。
bin/rails zeitwerk:check
deploy時のwarning修正
bundle install 時に flag is deprecatedが 発生するので修正
/config/deploy.rb
set :bundle_flags, '--quiet' # this unsets --deployment, see details in config_bundler task details
set :bundle_path, nil
set :bundle_without, nil
# flag is deprecatedの対応
desc 'Config bundler'
task :config_bundler do
on roles(/.*/) do
within release_path do
execute :bundle, :config, '--local deployment true'
execute :bundle, :config, '--local without "development test"'
execute :bundle, :config, "--local path #{shared_path.join('bundle')}"
end
end
end
まとめ
Rails5からRails6へのアップデート手順をまとめていきました。
今回はzeitwerkへの対応が面倒だと感じました。
アプリ内ではlib配下に共通ライブラリやバッチから呼ばれるソースコードを置いていたので
自動で読み込まれて欲しいものとそうでないものを切り分け、ディレクトリを移動させました。
参考
・bundle config で capistrano の flag is deprecated に対応する
・Ruby on Rails 6の主要な新機能・機能追加・変更点
・定数の自動読み込みと再読み込み (Zeitwerk)
・Rails アップグレードガイド
・Rails 5 から Rails 6 へアップデートした際の手順