Skip to main content
The Kai Way

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

除了Bundler和sprockets-rails外的几个Act***框架都是放在 Rails的Repo里,还有以下介绍的大部分***-rails 的Rails与其它库的集成都是放在Rails的Github账号下的, 如sprockets-rails。

当然,各个组件还引用了其它的依赖

必要组件 #

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而已。