Railsの初期化プロセスを追ってみる

rails serverが起動されてアプリが動くまでの順序を知りたいと思い、Railsガイドの以下のページを読んでおりました。

railsguides.jp

 

 

はじめの方にbin/railsファイルの解説が出てきたのですが、

「そもそもbin/railsbinてなんだ?たまにbin付きでbin/rails cと指定しないと動かなかったりするのはなんなんだ?」と思いその部分を調べることにしました。

 

 

 

bin/railsファイルの中身

アプリroot/bin/rails

#!/usr/bin/env ruby

begin

  load File.expand_path('../spring', __FILE__)

rescue LoadError => e

  raise unless e.message.include?('spring')

end

APP_PATH = File.expand_path('../config/application', __dir__)

require_relative '../config/boot'

require 'rails/commands'

 

 

 

#!usr/bin/env rubyの部分では使用するインタプリタを指定しているようです。(Shebsngといいうらしい)

参考:https://qiita.com/mohira/items/566ca75d704072bcb26f

 

 

このソースファイルと同じディレクトリにあるspringファイルをloadしています。

エラーになった時の例外処理も行なっています。

 

その下ではAPP_PATHconfit/application.rb絶対パスを代入しています。

参考:https://maeharin.hatenablog.com/entry/20130104/p1

 

 

require_relatibe ../config/boot’の部分でconfig/boot.rbを読み込んでいます。

boot.rbではそのプロジェクトで使うバージョンのgembundlerで読みこむ設定をしているようです。

 

require 'rails/commands’の部分ではrailsコマンドのエイリアスを読み込んでいるようです。

 

rails/railties/lib/rails/commands.rb

require "rails/command"

aliases = {

  "g"  => "generate",

  "d"  => "destroy",

  "c"  => "console",

  "s"  => "server",

  "db" => "dbconsole",

  "r"  => "runner",

  "t"  => "test"

}

command = ARGV.shift

command = aliases[command] || command

Rails::Command.invoke command, ARGV

 

 

 

感想その他

bin/rails cするときとrails cだけの時の違いがまだピンときておりません。。。!!

実際にbin/railsを読みにいって、インタプリタを指定したり、springをロードしたり、APP_PATHへパスを代入したり、config/bootとrails/commandsを読み込んだりしていることはわかったのですが。

sshでサーバーに入ってrailsコンソール立ち上げる時はbin/rails cとしないと立ち上がってくれない時などは、APP_PATHがbin/rails指定しないと参照できないからなのでしょうか。。。??