Rails启动过程
在每个应用程序的/public目录下,都含有:dispatch.cgi、dispatch.fcgi、dispatch.rb 3个分发文件。系统会根据我们的配置执行其中相应的文件,调用不同的处理方式(CGI,FastCGI或是Ruby方式),同时该文件会加载整个rails环境。3个文件中的内容基本一样,仅对其中一个分发文件进行探讨!
这几个分发文件,首先通过如下代码读入/config目录下的environment.rb文件。
代码:
require File.dirname(_FIFE_)+"/../config/enviroment" unless defined?(RAILS_ROOT)
而在enviroment.rb文件中,一般可以查看Rails版本。
代码:
RAILS_GEM_VERSION = '2.0.2' # unless defined? RAILS_GEM_VERSION
由于没有定RAILS_ROOT会继续调用/config目录下的boot.rb文件:
代码:
require File.join(File.dirname(__FILE__), 'boot')
查看root.rb文件,它做了这样几件事情。一:设置环境变量
代码:
RAILS_ROOT = "#{File.dirname(__FILE__)}/.." unless defined?(RAILS_ROOT)
二:boot.rb接下来会检查是否存在#{RAILS_ROOT}/vendor/rails目录。因为rails应用程序的运行环境和版本关系比较大。如果存在boot.rb会启动该目录下的Rails初始化程序。否则boot.rb会加载rubygems并搜索environment.rb文件。如果不存在常量,boot.rb会尝试初始化系统最近安装的rails版本。
三:定义了正确的初始化程序路径。boot.rb会调用Rails模块下的Initializer类中的类方法run。
代码:Rails模块
# Don't change this file!
# Configure your app in config/environment.rb and config/environments/*.rb
RAILS_ROOT = "#{File.dirname(__FILE__)}/.." unless defined?(RAILS_ROOT)
module Rails
class << self
def boot!
unless booted?
preinitialize
pick_boot.run
end
end
def booted?
defined? Rails::Initializer
end
def pick_boot
(vendor_rails? ? VendorBoot : GemBoot).new
end
def vendor_rails?
File.exist?("#{RAILS_ROOT}/vendor/rails")
end
# FIXME : Ruby 1.9
def preinitialize
load(preinitializer_path) if File.exists?(preinitializer_path)
end
def preinitializer_path
"#{RAILS_ROOT}/config/preinitializer.rb"
end
end
class Boot
def run
load_initializer
Rails::Initializer.run(:set_load_path)
end
end
class VendorBoot < Boot
def load_initializer
require "#{RAILS_ROOT}/vendor/rails/railties/lib/initializer"
end
end
class GemBoot < Boot
def load_initializer
self.class.load_rubygems
load_rails_gem
require 'initializer'
end
def load_rails_gem
if version = self.class.gem_version
gem 'rails', version
else
gem 'rails'
end
rescue Gem::LoadError => load_error
$stderr.puts %(Missing the Rails #{version} gem. Please `gem install -v=#{version} rails`, update your RAILS_GEM_VERSION setting in config/environment.rb for the Rails version you do have installed, or comment out RAILS_GEM_VERSION to use the latest version installed.)
exit 1
end
class << self
def rubygems_version
Gem::RubyGemsVersion if defined? Gem::RubyGemsVersion
end
def gem_version
if defined? RAILS_GEM_VERSION
RAILS_GEM_VERSION
elsif ENV.include?('RAILS_GEM_VERSION')
ENV['RAILS_GEM_VERSION']
else
parse_gem_version(read_environment_rb)
end
end
def load_rubygems
require 'rubygems'
unless rubygems_version >= '0.9.4'
$stderr.puts %(Rails requires RubyGems >= 0.9.4 (you have #{rubygems_version}). Please `gem update --system` and try again.)
exit 1
end
rescue LoadError
$stderr.puts %(Rails requires RubyGems >= 0.9.4. Please install RubyGems and try again: http://rubygems.rubyforge.org)
exit 1
end
def parse_gem_version(text)
$1 if text =~ /^[^#]*RAILS_GEM_VERSION\s*=\s*["']([!~<>=]*\s*[\d.]+)["']/
end
private
def read_environment_rb
File.read("#{RAILS_ROOT}/config/environment.rb")
end
end
end
end
# All that for this:
Rails.boot!
模块有两个类:Initializer和Configuration。
Initializer类负责处理Rails的配置选项,并设置Rails的加载文件的路径。
Configuration维护Rails环境的配置参数。
Initializer 的run方法
def self.run(command = :process, configuration = Configuration.new)
yield configuration if block_given?
initializer = new configuration
initializer.send(command)
initializer
end
Configuration类会加载应用程序中相关的目录,并加载相关的文件
如:
def default_load_paths
paths = []
# Add the old mock paths only if the directories exists
paths.concat(Dir["#{root_path}/test/mocks/#{environment}"]) if File.exists?("#{root_path}/test/mocks/#{environment}")
# Add the app's controller directory
paths.concat(Dir["#{root_path}/app/controllers/"])
# Then components subdirectories.
paths.concat(Dir["#{root_path}/components/[_a-z]*"])
# Followed by the standard includes.
paths.concat %w(
app
app/models
app/controllers
app/helpers
app/services
components
config
lib
vendor
).map { |dir| "#{root_path}/#{dir}" }.select { |dir| File.directory?(dir) }
paths.concat builtin_directories
end
你也可以做相应的修改。
初始化过程结束返回到enviroment.rb文件。
分享到:
- 2009-02-01 10:55
- 浏览 2929
- 评论(0)
- 论坛回复 / 浏览 (0 / 3446)
- 查看更多
相关推荐
在 Rails 应用程序中,Rake 通常用于数据库迁移、测试、清理等操作,以及启动后台任务。 在 Rails3 中,rake 不仅用于基本的项目管理,还可以用于启动后台任务,这在处理耗时操作、异步任务或者批量数据处理时非常...
9. **启动服务器**:使用`rails server`命令启动Rails服务器,通常默认端口为3000,访问`http://localhost:3000`查看Redmine界面。 10. **问题解决**:在“搭建问题解决方法”这个文件中,可能包含了在搭建过程中...
打开“Terminal”视图,输入`rails server`启动服务器,然后在浏览器中访问`http://localhost:3000`查看你的应用。 在开发过程中,Aptana的调试工具是必不可少的。你可以设置断点,单步执行代码,查看变量值,帮助...
Ruby是整个Ruby on Rails开发环境的核心,安装过程相对简单。首先,我们需要下载Ruby One-Click Installer版本。访问Ruby官方网站或镜像站点,下载与操作系统相对应的Ruby安装包,确保下载的版本至少为1.8.6。安装...
- **命令**:在项目根目录下运行`rails server`即可启动Rails内置的Web服务器。 - **测试**:通过浏览器访问`http://localhost:3000`来查看应用是否正常运行。 #### 五、升级与回滚 - **升级**:当需要更新到Rails...
在本文中,我们将深入分析 Ruby on Rails 2.0.2 的源代码,特别是关注其启动过程。 首先,Rails 的启动始于 `config/boot.rb` 文件。这个文件是 Rails 应用程序的入口点,负责检查 Rails 是否已启动。如果没有,它...
- **启动和应用设置**:这部分介绍如何配置Rails项目的启动过程以及如何设置各种环境变量,包括开发、测试和生产环境的差异配置。 - **不同模式下的配置**: - **开发模式**:通常包含更多的调试信息和详细的错误...
Rails是Ruby on Rails框架的简称,它是一种基于Ruby语言的开源Web开发框架,以其MVC(Model-View-Controller)架构而闻名,旨在简化Web应用的开发过程。在早期的Rails版本中,Mongrel是一个常用的HTTP服务器,用于...
在Rails 2中,配置信息主要存储在`config/environment.rb`文件中,其中包含了初始化过程中的各种设置,如加载路径、gem依赖和插件配置等。然而,Rails 3对此进行了重大重构,将配置信息移到了`config/application.rb...
启动Rails服务器(`ruby script/server`),访问`http://localhost:3000`,如果看到关于应用程序环境的信息,那么恭喜,你的配置工作已经顺利完成。 需要注意的是,配置过程中可能会遇到各种问题,如网络不稳定、...
另外,Rails中的Web服务器启动和运行也是开发过程中的一个基本步骤。在Rails项目目录下,可以通过运行“ruby script/server”(或更现代的命令如“rails server”或“rails s”)来启动内置的WEB服务器,这个服务器...
6. 启动服务器:`rails s`。 7. 访问`http://localhost:3000/`查看应用。 #### 三、项目结构概述 Rails项目通常由多个组成部分构成,了解这些组成部分有助于更好地组织代码和资源: - **Gemfile**:用于声明项目...
Ruby on Rails,简称Rails,是基于Ruby语言的一个开源Web应用程序框架,它遵循MVC(Model-View-Controller)架构模式,旨在使Web开发过程更加高效、简洁。本压缩包中的"Ruby on Rails入门经典代码"提供了新手学习...
进入项目目录后,可以使用以下命令启动Rails控制台和服务器: ```bash cd my_project_name rails console rails server -p 3000 ``` ##### 7. 文档与API文档 可以通过`rake doc:rails`命令生成Rails API文档: `...
6. **bin/**:包含Rails的可执行脚本,如启动服务器(rails server)和运行测试(rails test)。 7. **public/**:存放静态资源,如HTML、CSS、JavaScript文件和图片。 8. **lib/**:用于存放自定义库和扩展代码。...
在上述过程中,我们讨论了Ruby如何模仿Rails的MVC架构,以及如何在Ubuntu系统上启动和运行一个Ruby应用。理解MVC模式对于开发高效、可维护的Web应用至关重要,而Ruby on Rails提供了一个强大且易于使用的工具集,...
进入新创建的项目目录,运行 `rails server` 或简写 `rails s` 启动开发服务器。然后,你可以在浏览器中访问 `http://localhost:3000` 查看默认页面。 8. **使用Gems**: "rails_gems" 这个文件名可能指的是Rails...
5. 接下来,可以启动Rails服务器,运行`rails server`,然后在浏览器中访问`http://localhost:3000`查看应用。 6. `rails_setup`可能还包括数据库迁移,运行`rails db:create`来创建数据库,`rails db:migrate`将...
7. 使用`rails server`启动应用,测试是否能正常运行。 这个资源包提供了所有必需的组件,使得开发者可以按照文档逐步操作,在Linux环境中搭建起Ruby on Rails的开发环境。对于初学者或需要在非标准环境中部署RoR...
**标题与描述**:为了更好地理解和使用Rails框架,本书还探讨了一些底层的技术细节,例如框架的启动过程、配置选项、命名约定等。 **详细说明**: - **启动过程**:从启动命令到Web服务器的整个过程进行了详细的...