Rails 5:在生产环境中加载lib文件

我已经将我的一个应用程序从Rails 4.2.6升级到了Rails 5.0.0。 升级指南指出,自动加载function现在在默认情况下在生产中被禁用。

现在我总是在我的生产服务器上出现错误,因为我在application.rb文件中加载了所有带自动加载的lib文件。

 module MyApp class Application < Rails::Application config.autoload_paths += %W( lib/ ) end end 

现在,我已经将config.enable_dependency_loading设置为true但我想知道是否有更好的解决scheme。 必须有一个原因,默认情况下,自动加载function在生产中被禁用。

移至Rails 5之后的更改列表:

  1. lib目录放在app因为app所有代码都是在dev中自动加载的 ,并且在prod中加载的时候非常重要,而且最重要的是在开发中自动 加载 ,所以每次进行更改时都不必重新启动服务器。
  2. 删除任何指向你自己的lib内部类的require语句,因为如果它们的文件/目录命名是正确的,它们都是自动加载的,如果你离开require语句,它可能会破坏自动重载。 更多信息在这里
  3. 在所有环境中设置config.eager_load = true ,以便在开发中看到代码加载问题。
  4. 使用Rails.application.eager_load! 之前玩线程,以避免“循环依赖”的错误。
  5. 如果你有任何ruby / rails的扩展,那么把这个代码放在旧的lib目录下,并从初始化工具手动加载它们。 这将确保扩展在你可能依赖于它的进一步逻辑之前加载:

     # config/initializers/extensions.rb Dir["#{Rails.root}/lib/ruby_ext/*.rb"].each { |file| require file } Dir["#{Rails.root}/lib/rails_ext/*.rb"].each { |file| require file } 

由于线程安全,自动加载在生产环境中被禁用。 感谢@Зелёный的链接。

我通过将lib文件存储在我的app目录的lib文件夹中解决了这个问题,正如在Github上推荐的那样。 app文件夹中的每个文件夹都会被Rails自动加载。

必须有一个原因,默认情况下,自动加载function在生产中被禁用。

这是一个关于这个问题的长时间的讨论。 https://github.com/rails/rails/issues/13142

我只是使用config.eager_load_paths而不是config.autoload_paths就像git提到akostadinov评论: https : //github.com/rails/rails/issues/13142#issuecomment-275492070

 # config.autoload_paths << "#{Rails.root}/lib" config.eager_load_paths << "#{Rails.root}/lib" 

它适用于开发和生产环境。

对于像我这样挣扎的人来说,仅仅在app/下放置一个目录是不够的。 是的,你会得到自动加载,但没有必要重新加载,这需要实现命名空间惯例 。

此外,使用初始化程序加载旧的根级lib将防止在开发过程中重新加载function。

移动lib文件夹到应用程序帮助解决了一个问题,我的Twitter API不会在生产中运行。 我有“未初始化的常量TwitterApi”和我的Twitter API在我的lib文件夹。 我在我的application.rb中config.autoload_paths += Dir["#{Rails.root}/app/lib"] ,但在移动文件夹之前它不工作。

这个伎俩