Rails,启动-重要
http://www.blogjava.net/sshwsfc/archive/2006/11/20/82401.html
为了记录自己看Rails源码的过程,全程记录无废话。我们看看script/server都干了什么
引用了boot.rb这个文件。看来这个文件是rails启动的入口,来看看怎么回事吧。
root_path=File.join(File.dirname(__FILE__),'..')
unlessRUBY_PLATFORM=~/mswin32/
require'pathname'
root_path=Pathname.new(root_path).cleanpath(true).to_s
end
RAILS_ROOT=root_path
end这一部分定义了RAILS_ROOT这个系统的全局变量,指定了项目的根目录,大家可以在以后华丽的使用了。下一部分是找到rails,粗略看一下。
require"#{RAILS_ROOT}/vendor/rails/railties/lib/initializer"
else
require 'rubygems'这里能看到,他先跑到vendor/rails去找rails了,这就是我们为什么能在插件里用rails是原因。如果没有那么gems的干活。
接下来是初始化一下load_path,没什么看的了。boot.rb就这样的吧。
回到script/server的第二行,包含了'commands/server'这个文件,这个文件是什么?Rails的源码里面找吧。我们在Rails的源码里面找到这个文件。
require'fileutils'
begin
require_library_or_gem'fcgi'
rescueException
#FCGInotavailable
end
server=caseARGV.first
when"lighttpd"
ARGV.shift
when"webrick"
ARGV.shift
else
ifRUBY_PLATFORM!~/mswin/&&!silence_stderr{`lighttpd-version`}.blank?&&defined?(FCGI)
"lighttpd"
else
"webrick"
end
end
ifserver=="webrick"
puts"=>BootingWEBrick"
else
puts"=>Bootinglighttpd(use'script/serverwebrick'toforceWEBrick)"
end
FileUtils.mkdir_p(%w(tmp/sessionstmp/cachetmp/sockets))
require"commands/servers/#{server}"
从参数一目了然,我们可以传入server的名字,lighttpd和webrick,根据不同的server选择不同的server文件来读取。我们还是看看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.optionsdo|opts|
script_name=File.basename($0)
opts.banner="Usage:ruby#{script_name}[options]"
opts.separator""
opts.on("-p","--port=port",Integer,
"RunsRailsonthespecifiedport.",
"Default:3000"){|v|OPTIONS[:port]=v}
opts.on("-b","--binding=ip",String,
"BindsRailstothespecifiedip.",
"Default:0.0.0.0"){|v|OPTIONS[:ip]=v}
opts.on("-e","--environment=name",String,
"Specifiestheenvironmenttorunthisserverunder(test/development/production).",
"Default:development"){|v|OPTIONS[:environment]=v}
opts.on("-m","--mime-types=filename",String,
"SpecifiesanApachestylemime.typesconfigurationfiletobeusedformimetypes",
"Default:none"){|mime_types_file|OPTIONS[:mime_types]=WEBrick::HTTPUtils::load_mime_types(mime_types_file)}
opts.on("-d","--daemon",
"MakeRailsrunasaDaemon(onlyworksifforkisavailable--meaningon*nix)."
){OPTIONS[:server_type]=WEBrick::Daemon}
opts.on("-c","--charset=charset",String,
"Setdefaultcharsetforoutput.",
"Default:UTF-8"){|v|OPTIONS[:charset]=v}
opts.separator""
opts.on("-h","--help",
"Showthishelpmessage."){putsopts;exit}
opts.parse!
end
ENV["RAILS_ENV"]=OPTIONS[:environment]
RAILS_ENV.replace(OPTIONS[:environment])ifdefined?(RAILS_ENV)
requireRAILS_ROOT+"/config/environment"
require'webrick_server'
OPTIONS['working_directory']=File.expand_path(RAILS_ROOT)
puts"=>Railsapplicationstartedonhttp://#{OPTIONS[:ip]}:#{OPTIONS[:port]}"
puts"=>Ctrl-Ctoshutdownserver;callwith--helpforoptions"ifOPTIONS[:server_type]==WEBrick::SimpleServer
DispatchServlet.dispatch(OPTIONS)
:port=>端口,
:ip=>serverip,
:environment=>运行环境,
:server_root=>web访问的目录,(很多人问这个怎么改)
:server_type=>WEBrick::SimpleServer,
:charset=>"UTF-8",编码
:mime_types=>WEBrick::HTTPUtils::DefaultMimeTypes
后面的require引入了两个文件,一个是'webrick_server',别看,就是他。另外一个是config/environment,这个文件是系统的全局配置文件,很重要,我们还是下次看看这个文件去吧。里面还真挺有意思。
(不知道blogjava让不让写ROR的文章,看到有人写了所以放在首页了,如果不妥,我会尽快删除)