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之后的更改列表:
- 将
lib
目录放在app
因为app
所有代码都是在dev中自动加载的 ,并且在prod中加载的时候非常重要,而且最重要的是在开发中自动 加载 ,所以每次进行更改时都不必重新启动服务器。 - 删除任何指向你自己的
lib
内部类的require
语句,因为如果它们的文件/目录命名是正确的,它们都是自动加载的,如果你离开require
语句,它可能会破坏自动重载。 更多信息在这里 - 在所有环境中设置
config.eager_load = true
,以便在开发中看到代码加载问题。 - 使用
Rails.application.eager_load!
之前玩线程,以避免“循环依赖”的错误。 -
如果你有任何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"]
,但在移动文件夹之前它不工作。
这个伎俩