前言
Rails 3中出现了很多新的名词,如Railtie,engine,application等,这些都和Rails的启动过程及gem的开发密切相关,由于好奇,想尝试分析整个Rails 3的启动过程,给自己一个交代。
从我们在工程目录下输入:
rails s
开始。首先看看这个命令中的rails是什么:
$ which rails
/home/tomwang/.rvm/gems/ruby-1.9.3-p194@rails323/bin/rails
这个启动脚本如下:
#!/usr/bin/env ruby
#
# This file was generated by RubyGems.
#
# The application 'railties' is installed as part of a gem, and
# this file is here to facilitate running it.
#
require 'rubygems'
version = ">= 0"
if ARGV.first
str = ARGV.first
str = str.dup.force_encoding("BINARY") if str.respond_to? :force_encoding
if str =~ /\A_(.*)_\z/
version = $1
ARGV.shift
end
end
gem 'railties', version
load Gem.bin_path('railties', 'rails', version)
这个文件主要做了两件事:
- 导入railties这个gem,这是rails 3中的核心概念,后面还会对它进行更详尽的分析
- load railties这个gem下的另一个rails脚本:/home/tomwang/.rvm/gems/ruby-1.9.3-p194@rails323/gems/railties-3.2.3/bin/rails
#!/usr/bin/env ruby
if File.exists?(File.join(File.expand_path('../../..', __FILE__), '.git'))
railties_path = File.expand_path('../../lib', __FILE__)
$:.unshift(railties_path)
end
require "rails/cli"
这个rails主要是require了
"railties-3.2.3/lib/rails/cli.rb "
这个文件,它的内容如下:
require 'rbconfig'
require 'rails/script_rails_loader'
# If we are inside a Rails application this method performs an exec and thus
# the rest of this script is not run.
Rails::ScriptRailsLoader.exec_script_rails!
它最后一行执行的函数如下:
module Rails
module ScriptRailsLoader
RUBY = File.join(*RbConfig::CONFIG.values_at("bindir", "ruby_install_name")) + RbConfig::CONFIG["EXEEXT"]
SCRIPT_RAILS = File.join('script', 'rails