Rails,启动-重要

http://www.blogjava.net/sshwsfc/archive/2006/11/20/82401.html

为了记录自己看Rails源码的过程,全程记录无废话。我们看看script/server都干了什么

Rails,启动-重要require File.dirname(__FILE__)  +   ' /../config/boot ' Rails,启动-重要require  ' commands/server '

引用了boot.rb这个文件。看来这个文件是rails启动的入口,来看看怎么回事吧。

Rails,启动-重要unless defined?(RAILS_ROOT)

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

Rails,启动-重要end

这一部分定义了RAILS_ROOT这个系统的全局变量,指定了项目的根目录,大家可以在以后华丽的使用了。下一部分是找到rails,粗略看一下。

Rails,启动-重要  if File.directory?("#{RAILS_ROOT}/vendor/rails")

require"#{RAILS_ROOT}/vendor/rails/railties/lib/initializer"

else

Rails,启动-重要    require 'rubygems'

这里能看到,他先跑到vendor/rails去找rails了,这就是我们为什么能在插件里用rails是原因。如果没有那么gems的干活。

接下来是初始化一下load_path,没什么看的了。boot.rb就这样的吧。

回到script/server的第二行,包含了'commands/server'这个文件,这个文件是什么?Rails的源码里面找吧。我们在Rails的源码里面找到这个文件。

Rails,启动-重要require 'active_support'

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}"

没想到ActiveRecord居然是在这里引用的,这个ActiveRecord里面扩展了很对Ruby的既有类型,所以我们看源码的时候如果发现有不熟悉的方法,就来这里找找,当然,看Rails的API是最好的选择。

从参数一目了然,我们可以传入server的名字,lighttpd和webrick,根据不同的server选择不同的server文件来读取。我们还是看看webrick的吧。

Rails,启动-重要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.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)

本来不想把大段的代码贴上来,但是这里面的内容可能大家都比较关心,涉及到server的启动参数。

: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的文章,看到有人写了所以放在首页了,如果不妥,我会尽快删除)

相关推荐