🛤️

bin/rails sを実行した時に起こっていることをざっくり理解する

2022/11/04に公開約2,600字

コマンドbin/rails sを実行したときに起きていることをざっくり理解していきます。

  1. bin/rails sを実行
    binディレクトリのrailsファイルが実行され、gemの読み込み、railsコマンドの読み込みが行われる。s(server)、db(dbconsole)、g(generate)など

  2. bin/railsと一緒に渡したコマンドが実行される。s(server)が実行される

  3. railsサーバー(Rack)の設定を行う
    サーバーのもろもろの設定を行う中でRAILS_ENVの設定も行われます。

module Rails
  module Server
    def set_environment
      ENV["RAILS_ENV"] ||= options[:environment]
    end
  end
end

環境変数に"RAILS_ENV"が埋まっていればその値、埋まっていなければoption[:environment]となるみたいですね。RAILS_ENVが埋まっていればここで終わりますが、埋まっていないと想定して||= options[:environment]の部分をみていきましょう。

module Rails
  module Command
    class ServerCommand
      no_commands do
        def server_options
          {
            user_supplied_options: user_supplied_options,
            server:                using,
            log_stdout:            log_to_stdout?,
            Port:                  port,
            Host:                  host,
            DoNotReverseLookup:    true,
            config:                options[:config],
            environment:           environment,
            daemonize:             options[:daemon],
            pid:                   pid,
            caching:               options[:dev_caching],
            restart_cmd:           restart_command,
            early_hints:           early_hints
          }
        end
      end
    end
  end
end

server_optionsとなっていますが、こちらがoptionsの正体です。
environment: environmentとなっています。
続いてenvironmentメソッドを見てみましょう。
Rails::Commandのクラスメソッドとしてenviromentが定義されています。

module Rails
  module Command
    class << self
      def environment # :nodoc:
        ENV["RAILS_ENV"].presence || ENV["RACK_ENV"].presence || "development"
      end
    end
  end
end

ということで環境変数に"RAILS_ENV"があればその値、無ければ"RACK_ENV"を探し、どちらもなければ"development"となることがわかります。
環境変数に"RAILS_ENV"が埋まっている場合は先ほど見たset_environmentメソッドで処理が終わっているので、ENV["RACK_ENV"]が埋まっているかの条件がプラスされているだけになります。
環境変数にRACK_ENVを埋めるケースは見たことないし、開発環境では環境変数は何も埋めない、本番環境であれば以下のように値をセットする、というのが基本的な運用かと思います。

RAILS_ENV=production
  1. config/application.rbの読みこみ
    この辺りからRailsのフレームワークの設定となり、開発者の目に触れる機会が多くなる部分となると思います。環境に依存しない設定は基本こちらに書きます。
  2. config/environments/*.rbの読み込み
    環境に依存する設定をこちらに書きます。デフォルトでは(production/development/test)があります。環境はこの3つ以外にも任意に追加できます。ですが追加することはオススメしません。
    理由については別途記事にしようと思います。
  3. いろんな初期化が行われる
    4、5で様々な設定を行いましたが、その設定を元に初期化処理が行われます。
    初期化のリストについてはRailsガイドを一読することをお勧めします。https://railsguides.jp/configuring.html?version=7.0#イニシャライザ
  4. config/initializersの読み込み
    initializersの配下の読み込みを行います。利用するgemに関する設定などが基本ここにあるかと思います。

このように様々な処理が行われ、Railsのサーバーの起動が実行されます。
Railsガイドもぜひ参照して確認されてください!
https://railsguides.jp/initialization.html?version=7.0

Discussion

ログインするとコメントできます