最近因为开了一个企业级 Ruby 架构师训练营,其中有几个章节是专门讲Ruby on Rails源码
的。
虽然之前也经常翻阅,不过因为是讲课,必须保证讲的是正确的,还需要有比较顺畅的思路。
闲话少续,咱们开始正题。
要读 Rails 源码首先需要扎实的元编程
基础,这里推荐大家读一下Ruby元编程
这本书。
具备了这个基础后,接下来找个正确的姿势来读源码就不会觉得很难了。
众所周知,Rails 框架是由多个 Gem 组成的,比如ActiveRecord
, ActionController
, ActionDispatch
等,然后通过railties
这个 Gem 把它们组合起来。
我们在学习源码的过程中,可以直接把Rails
的 Github 仓库克隆下来,然后创建一个简单 DemoAPP,在 DemoAPP 中的Gemfile
文件里,把gem rails
指向本地:
# Gemfile
...
gem 'rails', path: 'your_rails_path/rails'
...
这样,我们就可以方便的测试rails
了。
如果我们直接的,漫无目的的去看源码,可能收效比较小。
那么,什么才是正确的看源码打开姿势呢?
我个人的习惯是这样的:
首先,以 ActionDispatch
为例,我们先了解一下它的主要功能,ActionDispatch
主要是用来处理 Rails 中的路由的。
那么我们怎么样去看源码呢?
我们需要先从宏观上认识一下整个的流程,这时候可以先去网上找找相关的资料。
比如说,我通过谷歌搜索ActionDispatch source code
得到了一下结果:
等等。
非常幸运地,我找到了这篇文章:
这样,我对整个 Gem ActionDispatch
有了一个宏观的认识。
这时,我在 DemoAPP 里面,新建了一条路由:
# config/routes.rb
byebug
get "home/index"
这时候,由于 Ruby 语言的特性,我们通过byebug
并不能逐步地跟踪下去。
所以,我们需要在rails
的 actiondispatch
文件里,找到相应的文件,在它访问地方法里,恰当地加入byebug
,或者binding.pry
。
下图是我设置的位置:
如果在调试的过程中,发现跳过一些自己希望关注的点,可以再在这个链路上,查找到相应的方法,然后找一个合适的位置设置断点。
通过这样的方式,基本可以掌握整体。
接下来,就可以深入文件内部去看了。
比如说文件的组织方式,rails 中一般都会有一个统一的文件,比如action_dispatch.rb
,它起到一个索引的作用,把各种 module 串起来去,把相应的文件通过autoload
加载进来。
然后会有一个对应的action_dispatch
文件夹。文件夹中的内容,会通过autoload
方法,被加载进来。
需要特别注意的是,很多 Ruby 默认的方法,Rails 都做了重新定义,比如delegate
, autoload
, 这点在读源码的时候要特别注意。
在读源码前,可以先看看active_support/core_ext
文件夹下面的内容,特别是kernel.rb
,module.rb
里面的内容。
以上就是我看源码的一些心得,希望对新手有些帮助。