几天前,我为 Rails 的依赖项和重载代码进行了一次重要的改进。过去,对 dependencies.rb 的更改会让那些胆敢尝试最新版本的人付出代价;这次我们努力避免了意外的破坏,但仍可能有一些更改会破坏您的应用程序。
在您冻结最新版本到之前的修订版之前,我应该解释一下,大多数破坏性更改都非常容易修复。在此修订版之前,Rails 会通过 const_missing 愉快地加载 Ruby 的标准库文件;现在您需要显式地 require 这些文件。(Rails 的自动加载旨在取代 require_dependency;它取代了 Ruby 的 require,这是令人遗憾且不期望的。)
这并非唯一的更改。Rails 的 Reloadable 模块已被弃用,并且之前独立的自动加载和卸载系统已合并为一体,成功地协同工作。
依赖项的新行为应该更可靠,也更令人满意。诸如模块无法重载之类的令人烦恼的问题已得到修复。意外加载 stdlib 包的情况将不再发生。
Dependencies 的实际机制现在相对简单。Rails 不再使用 Reloadable 来决定卸载哪些类,而是记录通过 const_missing 加载了哪些常量。请求完成后,每个自动加载的常量都会被移除,使进程处于干净的状态。实际机制稍微复杂一些,但并非过于复杂。您可以随意打开 dependencies.rb 并浏览代码。
希望这种方法新发现的简洁性能够提高 Dependencies 的透明度——有些软件最好是不被注意。如果您正在运行 trunk 版本,此更改确实会导致您的应用程序出错,请打开一个 ticket 并分配给 Ulysses。
在我离开之前,我想提及另一个(独立的)对 dependencies 的更改:当 Rails 找不到缺失的常量时,您现在将在描述中看到一个完全限定的常量名称。例如,如果您的 User 类中的某个方法引用了 Acount(而不是 Account),Rails 将会提示 User::Acount 缺失,而不是 ::Acount。请放心,Rails 已经在 Object 和 User 中查找了 Acount,只是报告了完全限定的常量名称,正如 Ruby 本身的 const_missing 所做的那样。