eager_load = true有什么影响?

Ale*_*lex 13 ruby-on-rails

我需要知道为什么eager_load首选false非生产环境?我听过的其中一个论点说,eager_load急切地将大部分Rails和应用程序加载到内存中.因此,使用eager_load进行单独测试会使其运行速度变慢.然而,这引发了一些问题,比如如何在不加载Rails和应用程序相关代码的情况下运行测试?什么是Rails和应用程序相关的代码正在急切加载?config.eager_load_namespaces给出以下类:

ActiveSupport ActionDispatch ActiveModel ActionView ActionController ActiveRecord ActionMailer Jquery::Rails::Engine MyApp::Application

是否所有这些类及其子类都被迫加载?

eager_load = false 在开发或测试环境中使用有哪些明显的缺点?

dre*_*-hh 5

但是,这引发了一些问题,例如如何在不加载Rails和与应用程序相关的代码的情况下运行测试?

测试尝试使用它时会按需加载必要的代码。因此,例如,在某些代码行上,测试要使用ActiveRecord该类。随着eager_load集到false这个类是没有要求的,这将导致对香草Ruby程序异常。但是在Rails项目中,测试将根据需要ActiveRecord进行使用。因此,最后一次测试运行得更快,因为只需要它所需的代码部分。

此技术与快速加载相反,称为自动加载

渴望加载的与Rails和应用程序相关的代码是什么?

查看https://github.com/rails/rails。这是一堆东西。

是否所有这些类及其子类都渴望加载?

在开发或测试环境中使用eager_load = false有哪些明显的缺点?

在开发环境中,这是一个优势和最佳实践,因为您可以获得更快的启动时间(使用像spring这样的预加载器时被忽略)。由于重新加载的cache_classes=false次数较少(假设),因此与选项一起重新加载更改也可能会更容易。

在测试环境中,eager_load=false如果您想估算一些代码指标(例如代码覆盖率或进行样式检查),有时就无法使用。例如,simple_cov要求您在开始测试之前急于加载所有代码。

通常,某些库可能无法与急切加载一起使用,因为它会在加载类之前进行一些初始化,该类即使在调用其方法之前也必须已经可用。然而,这是一种罕见的情况下,话虽如此,它发生在我们的neo4j.rb宝石

  • 我应该提到 test.rb 中的 eager_loading 导致我们的测试套件从 75.xx% 覆盖率跃升至 83.xx% 覆盖率。事实证明,simplecov 还考虑了加载文件时运行的代码(例如读取类和方法定义)。 (2认同)