`
meladet
  • 浏览: 27244 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Rails源码学习(一)

阅读更多
    Ruby是一门神奇的语言,里面有很灵活的语法和很多令人惊奇的特性。Rails这个时下异常流行的web开发框架将Ruby语言的特性与优势很好的发挥出来。最近用Rails开发了几个小程序,发现其开发效率真是很高,同时也应了Ruby语言的哲学:快乐编程。
    要想很好的了解和使用Rails,最好的方法莫过于读它的源码,最近正好在学习Rails的源码,把这个过程中的一些心得以及遇到的一些问题记录下来。在这个学习过程中,我使用的ruby 版本是1.8.6,使用的Rails版本是2.3.2。
    在使用Rails的时候,创建一个app是很简单的,一个命令’rails app_name’就能生成一个程序的基本框架。这是很神奇的事情,但是这是怎么做到的呢?先看Rails命令的执行过程,在Ruby安装目录的bin文件夹下在此文中使用{RUBY_HOME}表示Ruby的安装目录,可以看到rails命令,用文本编辑器打开:
#!c:/ruby/bin/ruby
#
# This file was generated by RubyGems.
#
# The application 'rails' is installed as part of a gem, and
# this file is here to facilitate running it. 
#

require 'rubygems'
version = "> 0"
if ARGV.first =~ /^_(.*)_$/ and Gem::Version.correct? $1 then
  version = $1
  ARGV.shift
end
gem 'rails', version
load 'rails'

先解释一下这这个文件中的内容,#开头的注释不多说:
1、require‘rubygems’,这句话说明需要加载rubygems.rb文件,那么这个文件在什么地方呢?这边需要了解require加载文件时候的查找路径都有哪些,ruby中也有类似java classpath的一个东西叫做$LOAD_PATH,存储在$:中,require加载后面的文件就是从这个变量中的路径开始。打开命令行窗口,输入ruby –e “puts $:”或者 ruby –e ”puts $LOAD_PATH”可以查看你系统中的ruby的loadpath。
C:\Documents and Settings\Administrator>ruby -e "puts $:"
c:/ruby/lib/ruby/site_ruby/1.8
c:/ruby/lib/ruby/site_ruby/1.8/i386-msvcrt
c:/ruby/lib/ruby/site_ruby
c:/ruby/lib/ruby/1.8
c:/ruby/lib/ruby/1.8/i386-mswin32
.

那么require ’rubygems’它就会去上面列出的几个路径中查找一个文件名为rubygems.rb,不难发现在{RUBY_HOME}/lib/ruby/site_ruby/1.8下面有这个文件。
2、version = "> 0",这句话说明加载gem的默认版本
3、这一段if可以接收用户输入gem的版本,如果不输入,则默认加载最新的版本。
4、gem ‘rails’,version调用的rubygems.rb中的方法,方法定义如下,这个方法的作用是激活满足版本条件的rails
{RUBY_HOME}/lib/ruby/site_ruby/1.8/rubygems.rb
def gem(gem_name, *version_requirements) # :doc:
    skip_list = (ENV['GEM_SKIP'] || "").split(/:/)
    raise Gem::LoadError, "skipping #{gem_name}" if skip_list.include? gem_name
    Gem.activate(gem_name, *version_requirements)
end

调用的用来加载gem安装的gem_name相关的文件,这个方法的定义也在rubygems.rb中,这个方法有点长,前面是检查version,后面是动态插入gem_name相关的bin_path到$LOAD_PATH中,以便后面使用。
5、到最后一句load ‘rails’了,这句话其实跟reqiure的功能一样。只不过是每次都重新加载rails文件,这个‘rails’文件也是从$LOAD_PATH中查找,在上一点说过Gem.activate(gem_name, *version_requirements)这个方法最后动态插入了gem_name相关的bin_path到$LOAD_PATH中,这个bin_path就包含了我们要找的’rails’。我们可以编辑rails命令的文件为如下:
#!c:/ruby/bin/ruby
#
# This file was generated by RubyGems.
#
# The application 'rails' is installed as part of a gem, and
# this file is here to facilitate running it. 
#

require 'rubygems'
version = "> 0"
if ARGV.first =~ /^_(.*)_$/ and Gem::Version.correct? $1 then
  version = $1
  ARGV.shift
end
gem 'rails', version
puts Gem.bin_path('rails','rails',version) #打印出rails的 bin路径[color=red][/color]
load 'rails'

这样从新在命令行下输入rails,可以看见会先打印出rails所在的bin路径。也就是load ‘rails’所找的位置。我电脑中显示出来的是:c:/ruby/lib/ruby/gems/1.8/gems/rails-2.3.2/bin/rails.
  接下去我们转到c:/ruby/lib/ruby/gems/1.8/gems/rails-2.3.2/bin/rails路径下的rails文件,用文本编辑器打开:
require File.dirname(__FILE__) + '/../lib/ruby_version_check'
Signal.trap("INT") { puts; exit }

require File.dirname(__FILE__) + '/../lib/rails/version'
if %w(--version -v).include? ARGV.first
  puts "Rails #{Rails::VERSION::STRING}"
  exit(0)
end

freeze   = ARGV.any? { |option| %w(--freeze -f).include?(option) }

app_path = ARGV.first

require File.dirname(__FILE__) + '/../lib/rails_generator'

require 'rails_generator/scripts/generate'
Rails::Generator::Base.use_application_sources!
Rails::Generator::Scripts::Generate.new.run(ARGV, :generator => 'app')

Dir.chdir(app_path) { `rake rails:freeze:gems`; puts "froze" } if freeze

1、进行ruby的版本检查
2、信号量相关,在后面的链接中有信号量的相关说明不过不知道在这个地方起了什么做用?(http://www.kuqin.com/rubycndocument/man/built-in-class/module_signal.html
3、载入rails的版本信息,接下去的if是如果用户输入的命令中带-v或—version的话就显示出rails的版本。
4、Freeze是冻结你的rails版本,可以防止你的rails自动升级而导致rails应用程序出现一些兼容性的问题。如果你输入了-f或者—freeze,在最后会执行命令:rake rails:freeze:gems,会把rails单独拷贝到你的 vender下,而rails启动的时候先看这个目录,如果有就加载,没有的话再加载系统的。
5、后面两句Rails::Generator开头的是调用generator的地方,第一句调用rails-2.3.2\lib\rails_generator\look_up.rb中的use_application_sources!方法,
# Use application generators (app, ?).
   def use_application_sources!
      reset_sources
      sources << PathSource.new(:builtin,"#{File.dirname(__FILE__)}/generators/applications")
   end

使用PathSource定位到rails-2.3.2\lib\rails_generator\generators\applications文件夹,第二句调用rails-2.3.2\lib\rails_generator\scripts.rb中的run方法。
# Run the generator script.  Takes an array of unparsed arguments
# and a hash of parsed arguments, takes the generator as an option
# or first remaining argument, and invokes the requested command.
  def run(args = [], runtime_options = {})
     begin
       parse!(args.dup, runtime_options)
       rescue OptionParser::InvalidOption => e
       # Don't cry, script. Generators want what you think is invalid.
     end

     # Generator name is the only required option.
     unless options[:generator]
        usage if args.empty?
        options[:generator] ||= args.shift
     end

     # Look up generator instance and invoke command on it.
     Rails::Generator::Base.instance(options[:generator], args, options).command(options[:command]).invoke!
     rescue => e
       puts e
       puts "  #{e.backtrace.join("\n  ")}\n" if options[:backtrace]
       raise SystemExit
  end

这个run方法会先解析ARGV中的参数,然后查找对应的generator,生成对应generator的实例,不同的generator有对应的templates。在这个地方调用的是app_generator.rb,生成整个应用程序的框架。

最后对上面的整个过程做一下整理,调用rails命令,生成程序框架的大致过程为:
(1)执行ruby\bin\rails命令--->(2)ruby,RubyGems,rails的版本检查--->(3)加载gem目录下rails安装路径的bin目录下的rails文件--->(4)解析命令行参数,调用对应的generator生成应用程序框架

PS:关于freeze: Ruby on Rails允许你freeze你应用程序所使用的Rails和相关Ruby Gems版本。这样不管你server上安装的Rails版本是多少,你的应用程序始终使用你所指定的版本。 当你的应用程序是用于商业或者是对稳定性有很高要求的时候,很有必要freeze你的rails,如果不freeze rails的话,有可能在升级了新版本的rails之后,导致你的产品由于兼容性问题而无法正常运行。然而,当你freeze了你的rails,那么你将不能得到rails自动更新带来的方便,你要时刻自己跟踪rails的最新版本,并且在需要的时候自己升级。后面这个链接中有freeze的详细信息。(http://support.tigertech.net/freeze-rails
分享到:
评论
1 楼 ruby-dl 2009-07-30  
很好, 很详细, 我也在做rails开发,有空时也也写一点, 希望多交流, myblogs: areq.cnblogs.com

相关推荐

    rails-exporter-源码.rar

    五、源码学习步骤 1. 阅读项目 README 文件,了解基本用法和安装步骤。 2. 分析 models 文件,理解数据获取逻辑。 3. 研究 controllers 文件,查看如何触发导出操作以及如何调用模型和视图。 4. 查看 views 文件,...

    Rails项目源代码

    Ruby on Rails,通常简称为Rails,是一个基于Ruby编程语言的开源Web应用框架,遵循MVC(Model-View-Controller)架构模式。这个“Rails项目源代码”是一个使用Rails构建的图片分享网站的完整源代码,它揭示了如何...

    ruby on rails 教程源码

    这个“ruby on rails 教程源码”很可能是为了辅助学习者深入理解Rails的工作原理和最佳实践,通过实际操作来提升技能。 在Rails中,`sample_app-master`可能是一个示例应用程序的主目录,它包含了完整的项目结构。...

    Rails进行敏捷Web开发(所有版本的源码rails3.0-4.0)

    Rails是Ruby语言的一个著名Web应用框架,以敏捷开发和“约定优于配置”...通过对这些版本的源码进行分析和学习,开发者不仅可以提升对Rails框架的理解,还能在实际项目中运用这些知识,编写出更高效、更安全的Web应用。

    rails查询学习笔记

    标签 "源码" 暗示了这篇笔记可能会涉及到一些实际的代码示例,读者可以通过阅读源码来理解和学习Rails查询的细节。而 "工具" 可能指的是Rails中用于辅助查询的工具或gem,如ActiveRecord的 scopes 和 relations,...

    Ruby on Rails源代码

    Ruby on Rails(简称Rails)是一种基于Ruby编程语言的开源Web应用程序框架,它遵循MVC(模型-视图-控制器)架构模式,旨在提高开发效率和可读性。Rails的哲学强调“约定优于配置”和“Don't Repeat Yourself”(DRY...

    rails 的安装

    标题 "rails 的安装" 涉及到的是Ruby on Rails框架的安装过程,这是一个用于构建Web应用程序的开源框架。Rails是基于Ruby编程语言,它强调DRY(Don't ...学习和实践是掌握Rails的关键,祝你在Rails开发旅程中一切顺利!

    Rails入门教程一(翻译).pdf

    **Rails入门教程一(翻译).pdf** Rails,全称为Ruby on Rails,是一个基于Ruby语言的开源Web应用程序框架,遵循MVC(Model-View-...通过学习,初学者可以快速掌握Rails的基本技能,为进阶开发打下坚实基础。

    基于ruby on rails开发示例源码

    通过分析这个源码,你可以学习如何使用Rails创建控制器、模型和视图,如何定义路由,如何处理表单提交,如何使用ActiveRecord进行数据库操作,以及如何编写测试确保代码质量。此外,你还可以了解Rails的自动化工具,...

    ruby on rails社区网站开发源码

    在“ruby on rails社区网站开发源码”中,我们可以学习到如何利用Rails构建一个互动性强、功能丰富的社区网站。以下是一些关键知识点: 1. **安装与环境设置**:首先,你需要安装Ruby和Rails。这通常涉及设置Ruby...

    RailsGuides中那个blog程序源码

    总的来说,RailsGuides中的"blog"程序是学习Rails基础的一个理想起点,涵盖了MVC架构、数据库操作、路由配置、视图渲染、控制器逻辑等多个关键概念。通过分析和实践这个项目,开发者能够快速掌握Ruby on Rails的核心...

    influxdb-rails-源码.rar

    《InfluxDB与Rails集成深度解析——以influxdb-rails源码为例》 InfluxDB,作为一款专为时间序列数据设计的高性能数据库,被广泛应用于监控、物联网、大数据分析等领域。Rails,作为Ruby on Rails框架的核心部分,...

    深入浅出Rails(中文版)

    《深入浅出Rails(影印版)》内容简介:通过此书,你将学习:希望你的网络应用超越平庸进入Web 2.0时代?《深入浅出Rails》将使你的编程和生产力达到最大值。你将学习一切Rails scaffolding的基本原理,以创建自定义的...

    Rails

    综合以上信息,学习和掌握Rails需要理解其核心组件和设计理念,熟练使用相关工具,阅读源码以加深对框架运作的理解,并通过实践项目来巩固理论知识。Rails是一个强大且高效的Web开发框架,它简化了许多常见的开发...

    ruby_on_rails 源代码上

    Rails的核心理念是“开发应该是一种快乐的体验”,它通过丰富的库、工具和社区支持来实现这一目标。 1. **Ruby语言基础** Ruby是一种面向对象的动态语言,以其简洁、优雅的语法著称。在学习Ruby on Rails之前,...

    关于rails 3.1 cucumber-rails 1.2.0

    首先,Rails 3.1是Ruby on Rails框架的一个版本,它在2011年发布。这个版本引入了一些显著的改进,如Asset Pipeline(资产管道)和CoffeeScript支持。Asset Pipeline允许开发者更有效地管理和优化应用程序的前端资源...

    《web开发敏捷之道 应用rails进行敏捷web开发》(第一版)的depot源代码

    "depot"是一个典型的电子商务应用程序,包含了商品管理、购物车和订单处理等功能,是学习Rails开发的理想实践项目。 在使用这个源代码时,你需要了解以下关键知识点: 1. **Ruby on Rails**:Rails是基于Ruby语言...

    ember-cli-rails-源码.rar

    通过深入分析`ember-cli-rails-源码.zip`,我们可以学习到如何在Rails项目中高效地构建、测试和部署Ember应用,理解这两个强大框架的协同工作原理,这对于提升前端开发的效率和质量具有重要意义。

    Ruby on Rails Tutorial 3 源码

    同时,这也是一个实践性的学习过程,有助于提升开发者对 Rails 框架的整体理解和应用能力。在学习过程中,理解每个组件的作用以及它们之间的协作关系至关重要,这将为后续的 Rails 开发奠定坚实的基础。

Global site tag (gtag.js) - Google Analytics