Railsの初期化プロセスを追ってみる
rails serverが起動されてアプリが動くまでの順序を知りたいと思い、Railsガイドの以下のページを読んでおりました。
はじめの方にbin/railsファイルの解説が出てきたのですが、
「そもそもbin/railsのbinてなんだ?たまに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_PATHにconfit/application.rbの絶対パスを代入しています。
※参考:https://maeharin.hatenablog.com/entry/20130104/p1
require_relatibe ‘../config/boot’の部分でconfig/boot.rbを読み込んでいます。
boot.rbではそのプロジェクトで使うバージョンのgemをbundlerで読みこむ設定をしているようです。
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指定しないと参照できないからなのでしょうか。。。??