Rails,启动-重要
http://www.blogjava.net/sshwsfc/archive/2006/11/20/82401.html
?
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的文章,看到有人写了所以放在首页了,如果不妥,我会尽快删除)
?
?