为什么 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 的其余部分将根据需要加载。
我 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 的其余部分将根据需要加载。