差沙的密码 -- SSHWSFC's code
阅读本Blog请自备塑料袋一只
posts - 14,  comments - 59,  trackbacks - 0

为了记录自己看Rails源码的过程,全程记录无废话。

我们看看script/server都干了什么

require File.dirname(__FILE__)  +   ' /../config/boot '
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这个系统的全局变量,指定了项目的根目录,大家可以在以后华丽的使用了。

下一部分是找到rails,粗略看一下。
  if File.directory?("#{RAILS_ROOT}/vendor/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 '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是最好的选择。

从参数一目了然,我们可以传入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的启动参数。
  :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的文章,看到有人写了所以放在首页了,如果不妥,我会尽快删除)
posted on 2006-11-20 23:43 差沙 阅读(4552) 评论(0)  编辑  收藏 所属分类: ROR

只有注册用户登录后才能发表评论。


网站导航:
 
这家伙很懒,但起码还是写了一句话。

<2006年11月>
2930311234
567891011
12131415161718
19202122232425
262728293012
3456789

常用链接

留言簿(8)

随笔分类

随笔档案

文章分类

搜索

  •  

最新评论

阅读排行榜

评论排行榜