说说Rails吧,启动开始。
为了记录自己看Rails源码的过程,全程记录无废话。
我们看看script/server都干了什么
require File.dirname(__FILE__)
+
'
/../config/boot
'
require ' commands/server '
require ' commands/server '
引用了boot.rb这个文件。看来这个文件是rails启动的入口,来看看怎么回事吧。
unless defined?(RAILS_ROOT)
root_path = File.join(File.dirname( __FILE__ ), ' .. ' )
unless RUBY_PLATFORM =~ / mswin32 /
require ' pathname '
root_path = Pathname.new(root_path).cleanpath(true).to_s
end
RAILS_ROOT = root_path
end
这一部分定义了RAILS_ROOT这个系统的全局变量,指定了项目的根目录,大家可以在以后华丽的使用了。
root_path = File.join(File.dirname( __FILE__ ), ' .. ' )
unless RUBY_PLATFORM =~ / mswin32 /
require ' pathname '
root_path = Pathname.new(root_path).cleanpath(true).to_s
end
RAILS_ROOT = root_path
end
下一部分是找到rails,粗略看一下。
if
File.directory?(
"
#{RAILS_ROOT}/vendor/rails
"
)
require " #{RAILS_ROOT}/vendor/rails/railties/lib/initializer "
else
require ' rubygems '
这里能看到,他先跑到 vendor/rails去找rails了,这就是我们为什么能在插件里用rails是原因。如果没有那么gems的干活。
require " #{RAILS_ROOT}/vendor/rails/railties/lib/initializer "
else
require ' rubygems '
接下来是初始化一下load_path,没什么看的了。boot.rb就这样的吧。
回到script/server的第二行,包含了 ' commands/server '这个文件,这个文件是什么?Rails的源码里面找吧。我们在Rails的源码里面找到这个文件。
require
'
active_support
'
require ' fileutils '
begin
require_library_or_gem ' fcgi '
rescue Exception
# FCGI not available
end
server = case ARGV.first
when " lighttpd "
ARGV.shift
when " webrick "
ARGV.shift
else
if RUBY_PLATFORM ! ~ / mswin / && !silence_stderr { `lighttpd - version` }.blank? && defined?(FCGI)
" lighttpd "
else
" webrick "
end
end
if server == " webrick "
puts " => Booting WEBrick "
else
puts " => Booting lighttpd (use 'script/server webrick' to force WEBrick) "
end
FileUtils.mkdir_p( % w( tmp / sessions tmp / cache tmp / sockets ))
require " commands/servers/#{server} "
没想到ActiveRecord居然是在这里引用的,这个ActiveRecord里面扩展了很对Ruby的既有类型,所以我们看源码的时候如果发现有不熟悉的方法,就来这里找找,当然,看Rails的API是最好的选择。
require ' fileutils '
begin
require_library_or_gem ' fcgi '
rescue Exception
# FCGI not available
end
server = case ARGV.first
when " lighttpd "
ARGV.shift
when " webrick "
ARGV.shift
else
if RUBY_PLATFORM ! ~ / mswin / && !silence_stderr { `lighttpd - version` }.blank? && defined?(FCGI)
" lighttpd "
else
" webrick "
end
end
if server == " webrick "
puts " => Booting WEBrick "
else
puts " => Booting lighttpd (use 'script/server webrick' to force WEBrick) "
end
FileUtils.mkdir_p( % w( tmp / sessions tmp / cache tmp / sockets ))
require " commands/servers/#{server} "
从参数一目了然,我们可以传入server的名字, lighttpd和webrick,根据不同的server选择不同的server文件来读取。我们还是看看webrick的吧。
require
'
webrick
'
require ' optparse '
OPTIONS = {
:port => 3000 ,
:ip => " 0.0.0.0 " ,
:environment => (ENV[ ' RAILS_ENV ' ] || " development " ).dup,
:server_root => File.expand_path(RAILS_ROOT + " /public/ " ),
:server_type => WEBrick::SimpleServer,
:charset => " UTF-8 " ,
:mime_types => WEBrick::HTTPUtils::DefaultMimeTypes
}
ARGV.options do | opts |
script_name = File.basename($0)
opts.banner = " Usage: ruby #{script_name} [options] "
opts.separator ""
opts.on( " -p " , " --port=port " , Integer,
" Runs Rails on the specified port. " ,
" Default: 3000 " ) { | v | OPTIONS[:port] = v }
opts.on( " -b " , " --binding=ip " , String,
" Binds Rails to the specified ip. " ,
" Default: 0.0.0.0 " ) { | v | OPTIONS[:ip] = v }
opts.on( " -e " , " --environment=name " , String,
" Specifies the environment to run this server under (test/development/production). " ,
" Default: development " ) { | v | OPTIONS[:environment] = v }
opts.on( " -m " , " --mime-types=filename " , String,
" Specifies an Apache style mime.types configuration file to be used for mime types " ,
" Default: none " ) { | mime_types_file | OPTIONS[:mime_types] = WEBrick::HTTPUtils::load_mime_types(mime_types_file) }
opts.on( " -d " , " --daemon " ,
" Make Rails run as a Daemon (only works if fork is available -- meaning on *nix). "
) { OPTIONS[:server_type] = WEBrick::Daemon }
opts.on( " -c " , " --charset=charset " , String,
" Set default charset for output. " ,
" Default: UTF-8 " ) { | v | OPTIONS[:charset] = v }
opts.separator ""
opts.on( " -h " , " --help " ,
" Show this help message. " ) { puts opts; exit }
opts.parse!
end
ENV[ " RAILS_ENV " ] = OPTIONS[:environment]
RAILS_ENV.replace(OPTIONS[:environment]) if defined?(RAILS_ENV)
require RAILS_ROOT + " /config/environment "
require ' webrick_server '
OPTIONS[ ' working_directory ' ] = File.expand_path(RAILS_ROOT)
puts " => Rails application started on http://#{OPTIONS[:ip]}:#{OPTIONS[:port]} "
puts " => Ctrl-C to shutdown server; call with --help for options " if OPTIONS[:server_type] == WEBrick::SimpleServer
DispatchServlet.dispatch(OPTIONS)
本来不想把大段的代码贴上来,但是这里面的内容可能大家都比较关心,涉及到server的启动参数。
require ' optparse '
OPTIONS = {
:port => 3000 ,
:ip => " 0.0.0.0 " ,
:environment => (ENV[ ' RAILS_ENV ' ] || " development " ).dup,
:server_root => File.expand_path(RAILS_ROOT + " /public/ " ),
:server_type => WEBrick::SimpleServer,
:charset => " UTF-8 " ,
:mime_types => WEBrick::HTTPUtils::DefaultMimeTypes
}
ARGV.options do | opts |
script_name = File.basename($0)
opts.banner = " Usage: ruby #{script_name} [options] "
opts.separator ""
opts.on( " -p " , " --port=port " , Integer,
" Runs Rails on the specified port. " ,
" Default: 3000 " ) { | v | OPTIONS[:port] = v }
opts.on( " -b " , " --binding=ip " , String,
" Binds Rails to the specified ip. " ,
" Default: 0.0.0.0 " ) { | v | OPTIONS[:ip] = v }
opts.on( " -e " , " --environment=name " , String,
" Specifies the environment to run this server under (test/development/production). " ,
" Default: development " ) { | v | OPTIONS[:environment] = v }
opts.on( " -m " , " --mime-types=filename " , String,
" Specifies an Apache style mime.types configuration file to be used for mime types " ,
" Default: none " ) { | mime_types_file | OPTIONS[:mime_types] = WEBrick::HTTPUtils::load_mime_types(mime_types_file) }
opts.on( " -d " , " --daemon " ,
" Make Rails run as a Daemon (only works if fork is available -- meaning on *nix). "
) { OPTIONS[:server_type] = WEBrick::Daemon }
opts.on( " -c " , " --charset=charset " , String,
" Set default charset for output. " ,
" Default: UTF-8 " ) { | v | OPTIONS[:charset] = v }
opts.separator ""
opts.on( " -h " , " --help " ,
" Show this help message. " ) { puts opts; exit }
opts.parse!
end
ENV[ " RAILS_ENV " ] = OPTIONS[:environment]
RAILS_ENV.replace(OPTIONS[:environment]) if defined?(RAILS_ENV)
require RAILS_ROOT + " /config/environment "
require ' webrick_server '
OPTIONS[ ' working_directory ' ] = File.expand_path(RAILS_ROOT)
puts " => Rails application started on http://#{OPTIONS[:ip]}:#{OPTIONS[:port]} "
puts " => Ctrl-C to shutdown server; call with --help for options " if OPTIONS[:server_type] == WEBrick::SimpleServer
DispatchServlet.dispatch(OPTIONS)
:port => 端口 ,
:ip => server ip ,
:environment => 运行环境 ,
:server_root => web访问的目录,(很多人问这个怎么改)
:server_type => WEBrick::SimpleServer,
:charset => " UTF-8 " , 编码
:mime_types => WEBrick::HTTPUtils::DefaultMimeTypes
后面的require 引入了两个文件,一个是'webrick_server',别看,就是他。另外一个是config/environment,这个文件是系统的全局配置文件,很重要,我们还是下次看看这个文件去吧。里面还真挺有意思。
(不知道blogjava让不让写ROR的文章,看到有人写了所以放在首页了,如果不妥,我会尽快删除)