几天前,我对 Rails 的依赖项和重新加载代码进行了重大改进。过去,对 dependencies.rb 的更改让那些足够勇敢地接受新版本的人血流成河;这次我们努力防止不小心的破坏,但可能有一些更改会破坏你的应用程序。
在你将新版本冻结为先前的版本之前,我应当解释一下,大多数破坏都是极易修复的。在这次版本中,Rails 会很高兴地通过 const_missing 从 Ruby 的标准 lib 中加载文件;现在你需要明确地 require 此类文件。(Rails 的自动加载被视为 require_dependency 的替代品;它代替 Ruby 的 require 这一点令人遗憾且不受欢迎。)
这个更改并不是唯一发生的更改。Rails 的 Reloadable 模块已被弃用,曾经独立的自动加载和卸载系统被汇集到一个美满的结合中。
Dependencies 的新行为应当更加可靠,并且更加令人愉悦。模块重新加载缺失等问题已经得到修复。不再会意外加载 stdlib 包。
Dependencies 的实际机制现在相对简单。它不再使用 Reloadable 来决定卸载哪些类,而是记录通过 const_missing 加载哪些常量。当请求完成后,每个自动加载常量都会被移除,使进程处于干净状态。实际机制略微复杂一些,但不太复杂。请随意打开 dependencies.rb 并浏览代码。
希望这种方法的新发现的简单性可以提高 Dependencies 的透明度——有些软件最理想的情况就是不为人察觉。如果你正在运行 trunk,此更改确实会导致你的应用程序出现错误,请打开 Ulysses 并分配一张工单。
在我走之前,我想提一下 dependencies 的另一个(独立的)更改:当 Rails 找不到缺失的常量时,你将在描述中看到一个完全限定的常量名称。例如,如果你的 User 类中的一个方法引用了 Acount(而不是 Account),则 Rails 将声明缺少的是 User::Acount,而不是 ::Acount。大可放心,Rails 已经在 Object 和 User 中查找了 Acount,并且仅仅报告了完全限定的常量名称,就像 Ruby 自身的 const_missing 所做的那样。