`
fantaxy025025
  • 浏览: 1329709 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类

Rails源码阅读(零)_config/boot

 
阅读更多

不论是script/console 还是 script/server 都会调用前置的文件:config/boot

现在分析一下这个文件的源代码,看看究竟做了哪些工作。

 

config/boot.rb阅读:
# 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
  ... ... 
end

# All that for this:
Rails.boot!
 看这个模块定义之外的代码就首尾两行,比较直观。
Rails模块内容:
#启动,做了两件事
  class << self
    def boot!
      unless booted?
        preinitialize
        pick_boot.run
      end
    end

# 可以在preinitialize这里写一个patch,做些rails启动之前的操作:
    def preinitializer_path
      "#{RAILS_ROOT}/config/preinitializer.rb"
    end

# pick_boot会找是用系统安装的rails还是固化到vender目录的rails
#1 verder的rails加载,3个步骤
  class VendorBoot < Boot
    def load_initializer
      require "#{RAILS_ROOT}/vendor/rails/railties/lib/initializer"
      Rails::Initializer.run(:install_gem_spec_stubs)
      Rails::GemDependency.add_frozen_gem_path
    end
  end
#2 系统安装的rails加载
  class GemBoot < Boot
    def load_initializer
      self.class.load_rubygems #=>require 'rubygems'操作和检查版本
      load_rails_gem #=>gem 'rails', version
      require 'initializer'
    end

# rails 是要用系统安装的,还是vender目录的,启动的时候仅仅有没有这个目录来决定
    def vendor_rails?
      File.exist?("#{RAILS_ROOT}/vendor/rails")
    end

# rails启动之前,如果想做些操作,放在哪里呢
    def preinitializer_path
      "#{RAILS_ROOT}/config/preinitializer.rb"
    end

# rails 启动的时候,知道gem版本么
      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
      private
        def read_environment_rb
          File.read("#{RAILS_ROOT}/config/environment.rb")
        end
  看见了么,只能在environment.rb里申明,如果是自己配置的话,不能在例如development.rb里申明

# EVN在很多地方用到,他在哪里定义的呢(我并没有发现在config里面定义的地方)
    Ok吧,在这里
    irb;Object.const_get('ENV')  或者用这个命令ruby -e 'puts Object.const_get("ENV").inspect'

# 一个设计模式,AcstractClass,父类没有必要非要显式申明一个接口给子类
java等编译型语言需要这么做,因为编译的时候会检查
非编译型语言可以不这么做
但申明的话,会更好看些,利于团队合作
  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"
      Rails::Initializer.run(:install_gem_spec_stubs)
      Rails::GemDependency.add_frozen_gem_path
    end
  end

最终Rails.boot!做了什么
class Boot
    def run
      load_initializer #选取了自带的rails还是vender的rails
      Rails::Initializer.run(:set_load_path) #这个是关键语句
    end
  end
#run的代码:
Rails::Initializer.run(:set_load_path) #做了什么
    def self.run(command = :process, configuration = Configuration.new) #这里已经new了一个conf
      yield configuration if block_given? #可以修改conf的配置
      initializer = new configuration #new 一个 initializer
      initializer.send(command) #执行command #-->>这里就是要执行:set_laod_path
      initializer
    end
    #set_laod_path的执行作用:
    # Rails::Initializer.run(:set_load_path)
    #
    # This is useful if you only want the load path initialized, without
    # incurring the overhead of completely loading the entire environment.

    # Set the <tt>$LOAD_PATH</tt> based on the value of
    # Configuration#load_paths. Duplicates are removed.
    def set_load_path
      load_paths = configuration.load_paths + configuration.framework_paths
      load_paths.reverse_each { |dir| $LOAD_PATH.unshift(dir) if File.directory?(dir) } #移除if it is not dir
      $LOAD_PATH.uniq!
    end
   
    #到底有多少framework:
    def framework_paths
      paths = %w(railties railties/lib activesupport/lib) #3个
     #1个,其实actionpack会加载:action_controller和:action_view
      paths << 'actionpack/lib' if frameworks.include?(:action_controller) || frameworks.include?(:action_view)

      [:active_record, :action_mailer, :active_resource, :action_web_service].each do |framework| #4个
        paths << "#{framework.to_s.gsub('_', '')}/lib" if frameworks.include?(framework)
      end

      paths.map { |dir| "#{framework_root_path}/#{dir}" }.select { |dir| File.directory?(dir) }
    end
 

==>>总结: 
require File.expand_path('../../config/boot',  __FILE__)
这个文件执行Rails.boot!,作用:
#1 根据有没有vender的rails,确定了使用rails的路径
#2 初始化了rails的环境路径(load_paths)(configuration.load_paths + configuration.framework_paths)



+
+
+
||
+
+
+

 

分享到:
评论

相关推荐

    ruby on rails源代码分析

    这个文件位于 `gems/rails-2.0.2/lib/initializer.rb` 对于 Gem 方式,或者 `RAILS_ROOT/vendor/rails/railties/lib/initializer.rb` 对于 Vendor 方式。`Initializer` 类在这个阶段执行核心的初始化任务,包括设置...

    rails上传文件_paperclip

    然后,在你的Rails应用中配置Paperclip,通常在`config/application.rb`或`config/environments/development.rb`中: ```ruby config.paperclip_defaults = { storage: :filesystem, path: ':rails_root/public...

    rails_admin_acts_as_list:rails_admin插件以对记录进行排序

    介绍插件,用于对记录进行排序(使用 gem)安装要启用rails_admin_acts_as_list,请将以下内容添加到您的Gemfile : gem 'rails_admin_acts_as_list'gem 'rails_admin' 重要提示: rails_admin_acts_as_list之前必须...

    safer_rails_console:使Rails Console的危险性降低!

    将以下行添加到Rails应用程序中“ config / boot.rb”的末尾。 require 'safer_rails_console/patches/boot' 用法 演示此gem的最快方法是运行bundle exec rails console --sandbox 。 在最后安装步骤中,将几种...

    rails3 和 thinking_sphinx安装

    Rails3 是 Ruby on Rails 框架的第三个主要版本,它在灵活性、性能和社区支持方面都有显著提升。Thinking Sphinx 是一个为 Rails 应用程序提供全文搜索功能的插件,它将数据库中的数据与 Sphinx 搜索引擎紧密结合,...

    rails_emoji_picker:将表情符号添加到您的应用

    Rails表情符号选择器 表情符号选择器与Rails应用程序的简单集成。 预习 安装 将此行添加到您的应用程序的Gemfile中: gem 'rails_emoji_picker' 用法 运行命令 rails g rails_emoji_picker:install 它将表情符号...

    rails_admin_import:Rails Admin导入功能

    Rails管理员导入 插件功能可将通用导入从CSV,JSON和XLSX文件添加到Rails Admin安装首先,添加到Gemfile中: gem "rails_admin_import" , "~&gt; 2.2" 在config/initializers/rails_admin_import.rb定义配置: ...

    rails_semantic_logger, Rails 语义记录器用语义记录器替换 Rails 缺省记录器.zip

    rails_semantic_logger, Rails 语义记录器用语义记录器替换 Rails 缺省记录器 Rails 语义记录器 语义记录器用语义记录器替代 Rails 缺省记录器。http://github.com/rocketjob/rails_semantic_logger文档有关完整文档...

    rails_admin_material:RailsAdmin的材料设计主题

    在config / application.rb中启用主题(紧接Bundler.require行之后): ENV['RAILS_ADMIN_THEME'] = 'material' 编辑或创建app / assets / javascripts / rails_admin / custom / ui.js并添加: //= r

    ama_styles:集中式AMA样式表

    起床并跑步运行bundle install 通过从ama_styles目录运行以下命令来设置.env文件: ln -s ~/src/rails_envs/ama_styles/.env.development .env.development ln -s ~/src/rails_envs/ama_styles/.env.staging .env....

    rubocop-rails_config:RuboCop配置,其代码检查与官方Ruby on Rails相同

    rubocop-rails_config RuboCop配置具有与官方Ruby on Rails相同的代码样式检查。 安装 将此行添加到您的应用程序的Gemfile : gem "rubocop-rails_config" 用法 将此行添加到您的应用程序的.rubocop.yml : ...

    rails_4_notebook

    Rails Notebook示例应用程序这是的示例应用程序的扩展 。 此项扩展的目的是允许为Rails应用推出Ruby笔记本。 一些有用的资源 这将通过扩展iRuby并使用rake任务来完成。 设置 : cd /tmpgit clone ...

    Ruby on Rails入门例子

    Ruby on Rails,简称Rails,是一种基于Ruby语言的开源Web应用程序框架,它遵循MVC(Model-View-Controller)架构模式,旨在使Web开发过程更加高效、简洁。本篇将通过一个入门实例,深入探讨Rails的基本概念和核心...

    Api-rails5_api_tutorial.zip

    Api-rails5_api_tutorial.zip,了解如何在michael hartl的rails 5教程上构建一个现代api立即在rails应用程序中构建一个api!(Rails 5版本),一个api可以被认为是多个软件设备之间通信的指导手册。例如,api可用于web...

    rails_apps_composer, 一个 gem,为 Rails 启动应用程序创建 Rails 应用程序模板.zip

    rails_apps_composer, 一个 gem,为 Rails 启动应用程序创建 Rails 应用程序模板 Rails 应用编辑器 Rails 应用程序编辑器 gem 安装一个 命令行 工具来从"食谱"的Collection 组装 Rails 应用程序。"你可以使用 rails_...

    RestFul_Rails_Dev_v_0.1

    ### RestFul_Rails_Dev_v_0.1 关键知识点解析 #### 1. REST 概念与背景 REST(Representational State Transfer)是一种软件架构风格,最初由 Roy Fielding 在他的博士论文中提出。它主张使用 HTTP 协议的标准方法...

    rails open_flash_chart

    "Rails Open Flash Chart" 是一个基于Ruby on Rails框架的库,用于在Web应用程序中生成交互式的Flash图表。这个库允许开发者轻松地创建各种统计图表,如折线图、柱状图、饼图等,以便更好地可视化数据。由于Flash在...

    RestFul_Rails_Dev_pdf_v_0.1.zip

    通过阅读这本书的翻译版,开发者不仅能学习到RESTful设计模式,还能掌握Rails框架下实现这些模式的具体方法和技术。无论是初学者还是经验丰富的Rails开发者,都能从中受益匪浅,提升自己的Web开发技能。

    themes_on_rails, 向 Rails 3/4/5 应用程序添加多个主题支持.zip

    themes_on_rails, 向 Rails 3/4/5 应用程序添加多个主题支持 ThemesOnRails 安装安装最简单的方法是使用 Bundler 。将这里 gem 添加到你的Gemfile:gem 'themes_on_rails'如果要对 liquid 模板使用

    rails_email_preview:在Rails中预览和编辑应用程序邮件模板

    Rails电子邮件预览 使用此Rails引擎在浏览器中预览电子邮件。 与Rails 4.2+兼容。 一封电子邮件评论: 所有电子邮件预览的列表: REP带有两个主题:一个简单的独立主题和一个使用的主题。安装加 到Gemfile: gem '...

Global site tag (gtag.js) - Google Analytics