為了記錄自己看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這個系統(tǒng)的全局變量,指定了項目的根目錄,大家可以在以后華麗的使用了。
下一部分是找到rails,粗略看一下。
??if?File.directory?("#{RAILS_ROOT}/vendor/rails")
????require?"#{RAILS_ROOT}/vendor/rails/railties/lib/initializer"
??else
????require?'rubygems'這里能看到,他先跑到
vendor/rails去找rails了,這就是我們?yōu)槭裁茨茉诓寮镉胷ails是原因。如果沒有那么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里面擴(kuò)展了很對Ruby的既有類型,所以我們看源碼的時候如果發(fā)現(xiàn)有不熟悉的方法,就來這里找找,當(dāng)然,看Rails的API是最好的選擇。
從參數(shù)一目了然,我們可以傳入server的名字,
lighttpd和webrick,根據(jù)不同的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)

本來不想把大段的代碼貼上來,但是這里面的內(nèi)容可能大家都比較關(guān)心,涉及到server的啟動參數(shù)。

??:port????????????
=>?端口,
??:ip??????????????=>?server ip,
??:environment?????=>運行環(huán)境,
??:server_root?????=>?web訪問的目錄,(很多人問這個怎么改)
??:server_type?????=>?WEBrick::SimpleServer,
??:charset?????????=>?"UTF-8", 編碼
??:mime_types??????=>?WEBrick::HTTPUtils::DefaultMimeTypes
后面的require?引入了兩個文件,一個是'webrick_server',別看,就是他。另外一個是config/environment,這個文件是系統(tǒng)的全局配置文件,很重要,我們還是下次看看這個文件去吧。里面還真挺有意思。
(不知道blogjava讓不讓寫ROR的文章,看到有人寫了所以放在首頁了,如果不妥,我會盡快刪除)
posted on 2006-11-20 23:43
差沙 閱讀(4572)
評論(0) 編輯 收藏 所屬分類:
ROR