1

我对 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 责备中找到这个更新,但这并没有帮助。

4

1 回答 1

1

在每个环境文件的后面一点,使用 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 的其余部分将根据需要加载。

于 2021-05-22T12:54:19.287 回答