概要
Rails で開発をしていて、たまに Rails 本体 (gem 'rails'
) のコードリーディングをしたいときがあるが、ただ読んでいるだけだと難しくて理解できないことが多い。
なので、Rails のコードをローカルにクローンし、開発中の Rails アプリからクローンした Rails のディレクトリを直接参照するようにすることで、実際に処理を動かしながらコードを追えるようにしたい。
また、開発中のアプリは Docker 上で開発していたので、Docker 環境で確認できるようにする。
記事執筆時の環境
macOS Monterey: 12.6.2
Ruby on Rails: 7.0.4
Docker Desktop: 4.15.0
Docker Compose: 3.9
対応したこと
任意のバージョンの Rails コードをローカルにクローンする。(今回は
7.0.4
)Docker のアプリ用コンテナ(今回は
web
という名前)にクローンした Rails のディレクトリをマウントする。docker-compose.yml に追記する。
今回は開発中の Rails アプリと同階層にクローンしてきたので、以下のようにする。
マウント先も任意なので、とりあえず
/lib/rails
としてみる。web: ~省略~ volumes: ~省略~ - ../rails:/lib/rails
Gemfile で
rails
を記述している箇所を以下のように書き換える。path
は Docker の volumes で指定したディレクトリ。- gem "rails", "~> 7.0.4" + gem "rails", path: '../lib/rails'
docker-compose up
し、web
コンテナ内でbundle install
する。あとは
rails c
で確認したい箇所のコードを実行し、binding.pry
などで随時処理を止めながら確認したり、クローンした Rails のコード内で適当にログを出力する処理を書いたりして確認する。例えば、以下のような処理を任意の箇所に記述して、実際に該当箇所を通る処理を画面やコンソールで動かしてみると、開発中のアプリ内に
debug.log
が吐き出され、処理の動きを確認できる。(もっと賢いやり方はいろいろありそう)logger = Logger.new('debug.log') logger.debug('hoge')
※ クローンした Rails のコードを修正したら、開発中アプリで
rails restart
などで再起動が必要。