Ruby 如何读 Ruby on Rails 源码

rocLv · September 27, 2021 · Last by geniusfox replied at October 03, 2021 · 1169 hits

最近因为开了一个企业级 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并不能逐步地跟踪下去。

所以,我们需要在railsactiondispatch 文件里,找到相应的文件,在它访问地方法里,恰当地加入byebug,或者binding.pry

下图是我设置的位置:

如果在调试的过程中,发现跳过一些自己希望关注的点,可以再在这个链路上,查找到相应的方法,然后找一个合适的位置设置断点。

通过这样的方式,基本可以掌握整体。

接下来,就可以深入文件内部去看了。

比如说文件的组织方式,rails 中一般都会有一个统一的文件,比如action_dispatch.rb,它起到一个索引的作用,把各种 module 串起来去,把相应的文件通过autoload 加载进来。

然后会有一个对应的action_dispatch 文件夹。文件夹中的内容,会通过autoload 方法,被加载进来。

需要特别注意的是,很多 Ruby 默认的方法,Rails 都做了重新定义,比如delegate, autoload, 这点在读源码的时候要特别注意。

在读源码前,可以先看看active_support/core_ext 文件夹下面的内容,特别是kernel.rbmodule.rb 里面的内容。

以上就是我看源码的一些心得,希望对新手有些帮助。

我的话直接 rubymine 直接在 controler 那里下个断点,然后看堆栈学习

rubymine 用得少,能介绍一下不?

加油,我还在 activesupport 的模块里面徘徊

You need to Sign in before reply, if you don't have an account, please Sign up first.