Hama Blog

Hama Blog

主にtech関連の記録

gem 'rails' のコードを Docker 環境で動かしながらコードリーディングする

概要

Rails で開発をしていて、たまに Rails 本体 (gem 'rails') のコードリーディングをしたいときがあるが、ただ読んでいるだけだと難しくて理解できないことが多い。

なので、Rails のコードをローカルにクローンし、開発中の Rails アプリからクローンした Railsディレクトリを直接参照するようにすることで、実際に処理を動かしながらコードを追えるようにしたい。

また、開発中のアプリは Docker 上で開発していたので、Docker 環境で確認できるようにする。

記事執筆時の環境

対応したこと

  1. 任意のバージョンの Rails コードをローカルにクローンする。(今回は 7.0.4)

    https://github.com/rails/rails/tree/v7.0.4

  2. Docker のアプリ用コンテナ(今回は web という名前)にクローンした Railsディレクトリをマウントする。

    docker-compose.yml に追記する。

    今回は開発中の Rails アプリと同階層にクローンしてきたので、以下のようにする。

    マウント先も任意なので、とりあえず /lib/rails としてみる。

       web:
         ~省略~
         volumes:
         ~省略~
           - ../rails:/lib/rails
    
  3. Gemfile で rails を記述している箇所を以下のように書き換える。

    path は Docker の volumes で指定したディレクトリ。

     - gem "rails", "~> 7.0.4"
     + gem "rails", path: '../lib/rails'
    
  4. docker-compose up し、web コンテナ内で bundle install する。

  5. あとは rails c で確認したい箇所のコードを実行し、binding.pry などで随時処理を止めながら確認したり、クローンした Rails のコード内で適当にログを出力する処理を書いたりして確認する。

    例えば、以下のような処理を任意の箇所に記述して、実際に該当箇所を通る処理を画面やコンソールで動かしてみると、開発中のアプリ内に debug.log が吐き出され、処理の動きを確認できる。(もっと賢いやり方はいろいろありそう)

     logger = Logger.new('debug.log')
     logger.debug('hoge')
    

    ※ クローンした Rails のコードを修正したら、開発中アプリで rails restart などで再起動が必要。