`
xxrrss
  • 浏览: 43268 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Rails启动过程

    博客分类:
  • Ruby
阅读更多
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文件。
分享到:
评论

相关推荐

    Rails3 使用rake启动后台任务

    在 Rails 应用程序中,Rake 通常用于数据库迁移、测试、清理等操作,以及启动后台任务。 在 Rails3 中,rake 不仅用于基本的项目管理,还可以用于启动后台任务,这在处理耗时操作、异步任务或者批量数据处理时非常...

    ruby on rails 搭建redmine

    9. **启动服务器**:使用`rails server`命令启动Rails服务器,通常默认端口为3000,访问`http://localhost:3000`查看Redmine界面。 10. **问题解决**:在“搭建问题解决方法”这个文件中,可能包含了在搭建过程中...

    Ruby on Rails安装指南(Ruby 1.8.6+Rails 2.0.2)

    Ruby on Rails 安装指南 Ruby on Rails 安装指南是指安装 Ruby 1.8.6 和 Rails ...通过这些知识点,可以了解 Ruby on Rails 安装的详细步骤和过程。同时,也可以学习到 Ruby、Rails 和 Mongrel 的基本概念和使用方法。

    使用Aptana+Rails开发Rails Web应用(中文)

    打开“Terminal”视图,输入`rails server`启动服务器,然后在浏览器中访问`http://localhost:3000`查看你的应用。 在开发过程中,Aptana的调试工具是必不可少的。你可以设置断点,单步执行代码,查看变量值,帮助...

    Ruby on Rails Guides v2 - Ruby on Rails 4.2.5

    - **命令**:在项目根目录下运行`rails server`即可启动Rails内置的Web服务器。 - **测试**:通过浏览器访问`http://localhost:3000`来查看应用是否正常运行。 #### 五、升级与回滚 - **升级**:当需要更新到Rails...

    ruby on rails源代码分析

    在本文中,我们将深入分析 Ruby on Rails 2.0.2 的源代码,特别是关注其启动过程。 首先,Rails 的启动始于 `config/boot.rb` 文件。这个文件是 Rails 应用程序的入口点,负责检查 Rails 是否已启动。如果没有,它...

    The Rails 4 Way

    - **启动和应用设置**:这部分介绍如何配置Rails项目的启动过程以及如何设置各种环境变量,包括开发、测试和生产环境的差异配置。 - **不同模式下的配置**: - **开发模式**:通常包含更多的调试信息和详细的错误...

    Rails 中mongrel的安装

    Rails是Ruby on Rails框架的简称,它是一种基于Ruby语言的开源Web开发框架,以其MVC(Model-View-Controller)架构而闻名,旨在简化Web应用的开发过程。在早期的Rails版本中,Mongrel是一个常用的HTTP服务器,用于...

    rails版本区别

    在Rails 2中,配置信息主要存储在`config/environment.rb`文件中,其中包含了初始化过程中的各种设置,如加载路径、gem依赖和插件配置等。然而,Rails 3对此进行了重大重构,将配置信息移到了`config/application.rb...

    ruby on rails与MySql的环境配置——支持rails 2.3.5以上版本

    启动Rails服务器(`ruby script/server`),访问`http://localhost:3000`,如果看到关于应用程序环境的信息,那么恭喜,你的配置工作已经顺利完成。 需要注意的是,配置过程中可能会遇到各种问题,如网络不稳定、...

    Ruby_On_Rails笔记

    另外,Rails中的Web服务器启动和运行也是开发过程中的一个基本步骤。在Rails项目目录下,可以通过运行“ruby script/server”(或更现代的命令如“rails server”或“rails s”)来启动内置的WEB服务器,这个服务器...

    Ruby on Rails入门经典代码

    Ruby on Rails,简称Rails,是基于Ruby语言的一个开源Web应用程序框架,它遵循MVC(Model-View-Controller)架构模式,旨在使Web开发过程更加高效、简洁。本压缩包中的"Ruby on Rails入门经典代码"提供了新手学习...

    centOS Rails3环境搭建

    进入项目目录后,可以使用以下命令启动Rails控制台和服务器: ```bash cd my_project_name rails console rails server -p 3000 ``` ##### 7. 文档与API文档 可以通过`rake doc:rails`命令生成Rails API文档: `...

    基于ruby on rails开发示例源码

    6. **bin/**:包含Rails的可执行脚本,如启动服务器(rails server)和运行测试(rails test)。 7. **public/**:存放静态资源,如HTML、CSS、JavaScript文件和图片。 8. **lib/**:用于存放自定义库和扩展代码。...

    ruby 例子 模仿rails 的 mvc

    在上述过程中,我们讨论了Ruby如何模仿Rails的MVC架构,以及如何在Ubuntu系统上启动和运行一个Ruby应用。理解MVC模式对于开发高效、可维护的Web应用至关重要,而Ruby on Rails提供了一个强大且易于使用的工具集,...

    rails 的安装

    进入新创建的项目目录,运行 `rails server` 或简写 `rails s` 启动开发服务器。然后,你可以在浏览器中访问 `http://localhost:3000` 查看默认页面。 8. **使用Gems**: "rails_gems" 这个文件名可能指的是Rails...

    rails-4.2.0-gems

    5. 接下来,可以启动Rails服务器,运行`rails server`,然后在浏览器中访问`http://localhost:3000`查看应用。 6. `rails_setup`可能还包括数据库迁移,运行`rails db:create`来创建数据库,`rails db:migrate`将...

    Ruby on Rails安装包全集(Linux)

    7. 使用`rails server`启动应用,测试是否能正常运行。 这个资源包提供了所有必需的组件,使得开发者可以按照文档逐步操作,在Linux环境中搭建起Ruby on Rails的开发环境。对于初学者或需要在非标准环境中部署RoR...

Global site tag (gtag.js) - Google Analytics