我一直在努力使用config.eager_load = true
在生产环境中部署应用程序。
我知道此配置将大多数Rails和应用程序代码加载到内存中,并且在生产(如)环境中具有很好的功能,问题是我有一个自定义的Rails引擎,其中的某些代码仅在某些特定环境中使用我的主要应用程序代码的模块,并且仅在某些文件上是必需的。
我的自定义引擎已在 Gemfile 中安装:
gem 'gem_name', require: false
,并且在以下文件中是必需的:
require 'gem_name'
因此,当我运行 rails s -e production
(已激活config.eager_load = true)时,它会自动失败,并显示以下错误
bootsnap / load_path_cache / core_ext / kernel_require.rb:58:在`load'中:否 此类文件要加载(LoadError)
关于在 Gemfile 上不需要gem时如何使eager_load工作的任何想法吗?
gem 'gem_name', require: false
如果在生产(如)环境中将eager_load设置为false,我会遇到什么问题?
答案 0 :(得分:0)
我研究了一下,尝试更新bootsnap gem,尝试从tmp / cache文件夹中删除'bootsnap-load-path-cache'和'bootsnap-compile-cache'。 本文可能有助于了解急切的负载https://blog.arkency.com/2014/11/dont-forget-about-eager-load-when-extending-autoload/
该主题可能有助于了解 What's the impact of eager_load=true?
它指向其他解决方案,不需要但可以自动加载(http://www.rubyinside.com/ruby-techniques-revealed-autoload-1652.html)
答案 1 :(得分:0)
对于那些需要自动加载目录中的所有文件而不需要它们的用户,可以执行以下操作:
Dir.glob(File.join(some_path, 'lib', 'extensions', '*.rb')).map do |file|
autoload File.basename(file).gsub('.rb', '').classify.to_sym, file
end
代替经典
Dir[File.join(some_path, 'lib', 'extensions', '*.rb')].each do |f|
require f
end