Dependencies of Rails
我们平时安装Rails时,执行的是gem install rails
,安装的Rubygem名称就叫rails,而这个Rubygem其实只是个没有代码的Meta Gem,它的作用就是定义rails依赖的组件。
本文是Inspect Rails的一部分,Inspect Rails是由我正在编写的讲解Rails内部的实现与设计的一本书,欢迎阅读
从 rails 的 gemspec 看到
# rails.gemspec
s.add_dependency 'activesupport', version
s.add_dependency 'actionpack', version
s.add_dependency 'activerecord', version
s.add_dependency 'actionmailer', version
s.add_dependency 'railties', version
s.add_dependency 'bundler', '>= 1.3.0', '< 2.0'
s.add_dependency 'sprockets-rails', '~> 2.0.0.rc4'
以上的依赖声明说明了Rails依赖于哪些组件,首先有几个active或action打头的Rubygem
- activesupport, 对Ruby语言的一些扩展,Rails的所有核心组件都是依赖于它
- actionpack, 包含了处理Web请求逻辑,包含了MVC中的Controller和View
- activerecord, 以Active Record模式为基础的ORM
- actionmailer, 包含邮件发送和接收逻辑
- railties, 把以上的组件组合起来
- sprockets-rails, Sprockets的Rails 集成代码,Sprockets为Rails带来了著名的Assets Pipeline,Rails 3.1引入
- bundler, 管理依赖Rubygem的版本
除了Bundler和sprockets-rails外的几个Act***框架都是放在 Rails的Repo里,还有以下介绍的大部分***-rails 的Rails与其它库的集成都是放在Rails的Github账号下的, 如sprockets-rails。
当然,各个组件还引用了其它的依赖
- builder, 创建XML数据的DSL
- rack, Ruby的Web Server接口,我们知道Rails是 一个基于Rack的Web框架
- rack-test, rack的测试框架
- erubis, 最快的ERB渲染引擎
- arel, 基于关系代数的SQL生成框架
- rake, 不解释
- thor, rake的替代品,在Rails中只用到了Thor的 文件操作功能去构建Generator
必要组件 #
Rails在gemspec里声明是核心组件,但并非是必要的组件,比如Assets Pipeline, ActiveRecord和ActionMailer不是一定需要包含在你的Rails Application里。
Rails 应用程序首先必须是个Rails Application,所以需要railites去维护整个程序的 加载和目录结构等。除此以外,Rails是个Web Framework,所以actionpack也是其必要的 组件之一。剩下的一个必要组件是,ActiveSupport,所有组件的必要依赖。
可选组件 #
AcitveRecord,在Rails 3之后属于可替换的组件。由于在Actionpack里如Routing和Form Helper严重依赖于ActiveRecord,所以Rails Core Team就抽象出了ActiveModel去解开 这个依赖,将Routing和Form Helper等需要调用到的部分,以Module的形式定义好接口, 只要包含或者实现了ActiveModel接口就能完美地与ActionPack协作。
ActionMailer,不是所有的Rails应用都有发邮件的需求,显然这不是必要的组件。
Sprockets,为Rails提供Assets Pipeline功能,但并不是所有人都喜欢它。在Rails应用 生成器里也提供了这个选项,去掉Assets Pipeline功能。
Test::Unit,Rails默认的测试框架,但由于Test::Unit是Ruby语言自带的,当开发者不想 直接使用它的时候,Rails只是关闭相关的代码生成器。另外,其他任何的测试框架都只是 Test::Unit的包装,添加了Syntax Sugar而已。
- Previous: Hello Octopress
- Next: Rails Internal Hierarchy