为什么 Rails6+ 默认开始在 config/environments/* 中添加 activesupport require?

Why Rails6+ started to adding activesupport requires in config/environments/* by default?

我 Rails 版本升级有点晚了。令我惊讶的是 Rails.

生成的 config/environment/* 文件中有一堆 active_support 要求

它们有什么用?跟Rails6中引入的Zeitwerk有关系吗? 我不记得它们出现在 Rails.

的旧版本中
ag ^require config/environments
config/environments/development.rb
1:require "active_support/core_ext/integer/time"

config/environments/test.rb
1:require "active_support/core_ext/integer/time"

config/environments/production.rb
1:require "active_support/core_ext/integer/time"

重现步骤:

rails new myapp

cat Gemfile  | grep "^gem 'rails'"
gem 'rails', '~> 6.1.3', '>= 6.1.3.2'

我试图在 rails/rails CHANGELOG 和一些 git 指责中找到此更新,但这没有帮助。

在每个环境文件的下方,使用 require 语句加载的代码(或者在生产文件的情况下在注释中引用)。从默认 development.rb:

# Enable/disable caching. By default caching is disabled.
# Run rails dev:cache to toggle caching.
if Rails.root.join('tmp/caching-dev.txt').exist?
  config.cache_store = :memory_store
  config.public_file_server.headers = {
    'Cache-Control' => "public, max-age=#{2.days.to_i}" # <- NOTE THIS LINE
  }
else
  config.action_controller.perform_caching = false

  config.cache_store = :null_store
end

require 语句增加了对 2.days.to_i 等表达式的支持 - core_ext/integer/time 加载了一些函数,但也需要 core_ext/numeric/time.

所以 require 语句是一个好的 Ruby 公民,并确保保证其代码所依赖的 Rails 的特定部分被加载,以便能够正确解析该行。

我不知道为什么以前不需要它(这可能是与 Zeitwerk 相关的问题,正如你所建议的那样,那是 Rails 6+ 的一部分我还不太熟悉).

但归根结底,如果整个 Rails 堆栈在评估此文件之前加载,则 require 将不会产生任何附加效果 - 如果没有,此文件将加载什么它需要,然后 Rails 的其余部分将根据需要加载。