此文章需要简单了解一下什么是自动加载(autoloading),如果不熟悉,请参阅 Rails Guide 自动加载和重新加载常量一章。
Eagerload paths
Autoloading 是非线程安全的,因此我们需要确保在应用程序启动时加载所有常量。 在实际用到之前加载所有常量称之为“Eager loading”,这个概念在某种程度上与“Autoloading”相反。 “Autoloading”是指应用程序直到需要一个常量的时候才去加载它,也就是所谓的懒加载。 当需要用到一个类但却找不到的时候,才开始在自动加载路径(autoloading paths)查找并加载缺少的类。
eager_load_paths
包含一个目录列表,当应用程序在生产环境启动时,便加载所有在 eager_load_paths
中列出的目录的所有常量。
我们可以把一个目录添加到 eager_load_paths
,如下所示:
# config/application.rb
config.eager_load_paths << Rails.root.join('lib')
Rails 5 的自动加载在生产环境下默认是禁用的
这个 Commit 使得 Rails 在生产启动时不再进行自动加载。
Rails 将从 eager_load_paths
加载所有的常量,但是当无法找到一个常量时,它将不会在 autoload_paths
中查找,并且也不会尝试去加载缺少的常量。
对于绝大多数应用程序,这应该不是一个问题。
在极个别的情况下,我们的应用程序仍然需要在生产环境中使用自动加载(“autoloading”),我们可以通过将enable_dependency_loading
设置为 true
来启用它,如下所示:
# config/application.rb
config.enable_dependency_loading = true
config.autoload_paths << Rails.root.join('lib')
文章翻译自 Rails 5 disables autoloading after booting the app in production