为 Rails 加载配置文件的顺序是啥?
Posted
技术标签:
【中文标题】为 Rails 加载配置文件的顺序是啥?【英文标题】:In what order are the config files loaded for Rails?为 Rails 加载配置文件的顺序是什么? 【发布时间】:2011-12-29 20:03:36 【问题描述】:我正在尝试为不同的环境初始化不同的 gem。我正在使用初始化程序配置文件(用于 Paperclip 之类的东西)和环境配置文件(用于我的 dev、test、qa、prod 环境)。
在某些情况下,我试图让我的 prod 和 qa 服务器将 S3 存储用于 Paperclip,但使用具有不同目录的本地存储进行开发和测试。我不知道这些配置文件的加载顺序。
我想知道是否有人可以阐明加载顺序,以便我可以确保我有任何依赖项或覆盖正确。另外,我只是想知道这些东西是如何工作的。
我对下面列出的目录/文件特别感兴趣
config/
environments/
develop.rb
test.rb
...env-specific config files
initializers/
paperclip.rb
...gem-specific config files
application.rb
boot.rb
deploy.rb
environment.rb
routes.rb
谢谢!
【问题讨论】:
【参考方案1】:Rails 6.0
2019 年 11 月更新:Initialization Process 和 Configuration
与 Rails 5.2 相同
导轨 5.2
2019 年 11 月更新:Initialization ProcessConfiguration
启动
-
railties/exe/rails
railties/lib/rails/app_loader.rb
bin/rails
config/boot.rb
rails/commands.rb
rails/command.rb
actionpack/lib/action_dispatch.rb
rails/commands/server/server_command.rb
机架:lib/rack/server.rb
配置/应用程序
Rails::Server#start
config/environment.rb
config/application.rb
加载
-
railties/lib/rails/all.rb
返回 config/environment.rb
railties/lib/rails/application.rb
机架:lib/rack/server.rb
导轨 4.2
2013 年 9 月更新:对于 Rails 4,它似乎再次发生了变化。现在有一个Rails-4 Guide on The Rails Initialization Process。您会注意到此列表比 Rails 3 的列表短很多。我不确定他们是否删除了一些深度或什么...没有时间回顾全部:
-
bin/rails
config/boot.rb
rails/commands.rb
actionpack/lib/action_dispatch.rb
rails/commands/server.rb
机架:lib/rack/server.rb
配置/应用程序
Rails::Server#start
config/environment.rb
config/application.rb
railties/lib/rails/all.rb
返回 config/environment.rb
railties/lib/rails/application.rb
机架:lib/rack/server.rb
有关如何配置其中一些文件的更多详细信息,请参阅Rails-4 Guide on Configuring Rails Applications
导轨 3.2
2013 年 9 月更新:对于 Rails 3,它似乎发生了很大变化。现在有一个Rails-3 Guide on The Rails Initialization Process:
-
bin/rails railties/lib/rails/cli.rb script/rails config/boot.rb
rails/commands.rb actionpack/lib/action_dispatch.rb
activesupport/lib/active_support.rb
activesupport/lib/active_support/lazy_load_hooks.rb
activesupport/lib/active_support/inflector/methods.rb
actionpack/lib/action_dispatch.rb 续。 rails/commands/server.rb
机架:lib/rack/server.rb Rails::Server#start config/environment.rb
config/application.rb 加载 Rails railties/lib/rails/all.rb
railties/lib/rails.rb railties/lib/rails/ruby_version_check.rb
active_support/core_ext/kernel/reporting.rb
active_support/core_ext/logger.rb railties/lib/rails/application.rb
active_support/file_update_checker.rb railties/lib/rails/plugin.rb
railties/lib/rails/engine.rb railties/lib/rails/railtie.rb
railties/lib/rails/initializable.rb
railties/lib/rails/configuration.rb
activesupport/lib/active_support/deprecation.rb
activesupport/lib/active_support/deprecation/behaviors.rb
activesupport/lib/active_support/notifications.rb
activesupport/core_ext/array/wrap
activesupport/lib/active_support/deprecation/reporting.rb
activesupport/lib/active_support/deprecation/method_wrappers.rb
activesupport/lib/active_support/deprecation/proxy_wrappers.rb
active_support/ordered_options railties/lib/rails/paths.rb
railties/lib/rails/rack.rb
activesupport/lib/active_support/inflector.rb
active_support/inflections
activesupport/lib/active_support/inflector/transliterate.rb 返回
railties/lib/rails/railtie.rb railties/lib/rails/engine/railties.rb
返回 railties/lib/rails/engine.rb 返回
railties/lib/rails/plugin.rb 返回
railties/lib/rails/application.rb railties/lib/rails/version.rb
activesupport/lib/active_support/railtie.rb
activesupport/lib/active_support/i18n_railtie.rb
railties/lib/rails/railtie/configuration.rb 返回
activesupport/lib/active_support/i18n_railtie.rb 返回
activesupport/lib/active_support/railtie.rb
activesupport/lib/action_dispatch/railtie.rb
activesupport/lib/action_dispatch.rb activemodel/lib/active_model.rb
activesupport/lib/active_support/i18n.rb 返回
activesupport/lib/action_dispatch.rb 返回
activesupport/lib/action_dispatch/railtie.rb 返回
railties/lib/rails.rb 返回 railties/lib/rails/all.rb
activerecord/lib/active_record/railtie.rb
activerecord/lib/active_record.rb 返回
activerecord/lib/active_record/railtie.rb
actionpack/lib/action_controller/railtie.rb
actionpack/lib/action_view.rb
有关如何配置其中一些文件的更多详细信息,请参阅Rails-3 Guide on Configuring Rails Applications
导轨 2.3
最初(2011 年 12 月),我偶然发现了一篇博客文章,其中对 How the Initialization Process Worked for Rails 2 进行了精彩的解释。
-
config/preinitializer.rb
config/environment.rb
config/environments/#RAILS_ENV.rb
插件初始化
gem 初始化
config/initializer/*.rb
所有 after_initialize 块,按照它们定义的顺序(与上面的顺序相同)
在 environment.rb 中的 Rails::Initializer.run 调用/块下方留下的任何垃圾
有关如何配置其中一些文件的更多详细信息,请参阅Rails-2 Guide on Configuring Rails Applications
【讨论】:
这是用于 Rails 2 的吗?我不认为 rails 3 有 preinitializer.rb 另外,您应该添加在环境文件之后和初始化程序之前运行的 before_initialize 回调。 我在 Rails 2 应用程序中有 config/boot.rb,这有意义吗? @juanpastas - 我不确定,但它是 Rails 3 中的一件事 (guides.rubyonrails.org/v3.2.13/…) 如果它在 Rails 2 中停留,我不会感到惊讶。 @AniketShivamTiwari 现在似乎有一个官方的 Rails 指南正在维护中。可以在这里找到:guides.rubyonrails.org/initialization.html【参考方案2】:此答案用于补充接受的答案,接受的答案在 development.rb 和其他 init 文件加载时未提及。
在 ruby 2.0 中,我在 bin/rails 中插入以下代码,然后运行 'bin/rails s' 来查看本地应用程序文件的加载顺序。在这个例子中,我的项目名称是 bole_api。
files = []
tp = TracePoint.new(:line) do |tp|
if tp.path =~ /bole_api/
unless files.include? tp.path
puts "#tp.path".inspect
files.push(tp.path)
end
end
end
tp.enable
我的本地结果是
"/home/leijing/studio/bole_api/bin/rails"
"/home/leijing/studio/bole_api/config/boot.rb"
"/home/leijing/studio/bole_api/Gemfile"
"/home/leijing/studio/bole_api/config/application.rb"
=> Booting WEBrick
=> Rails 4.1.1 application starting in development on http://0.0.0.0:3000
=> Run `rails server -h` for more startup options
=> Notice: server is listening on all interfaces (0.0.0.0). Consider using 127.0.0.1 (--binding option)
=> Ctrl-C to shutdown server
"/home/leijing/studio/bole_api/config.ru"
"/home/leijing/studio/bole_api/config/environment.rb"
"/home/leijing/studio/bole_api/config/environments/development.rb"
"/home/leijing/studio/bole_api/config/initializers/carrierwave.rb"
"/home/leijing/studio/bole_api/config/initializers/cookies_serializer.rb"
"/home/leijing/studio/bole_api/config/initializers/filter_parameter_logging.rb"
"/home/leijing/studio/bole_api/config/initializers/rabl_init.rb"
"/home/leijing/studio/bole_api/config/initializers/session_store.rb"
"/home/leijing/studio/bole_api/config/initializers/wrap_parameters.rb"
"/home/leijing/studio/bole_api/config/routes.rb"
"/home/leijing/studio/bole_api/app/api/bole_app_api.rb"
"/home/leijing/studio/bole_api/app/api/home_api.rb"
"/home/leijing/studio/bole_api/app/api/video_api.rb"
[2014-06-27 11:06:57] INFO WEBrick 1.3.1
[2014-06-27 11:06:57] INFO ruby 2.1.0 (2013-12-25) [x86_64-linux]
[2014-06-27 11:06:57] INFO WEBrick::HTTPServer#start: pid=30157 port=3000
从上面的输出中,您可以了解本地文件的加载顺序。并结合http://edgeguides.rubyonrails.org/initialization.html的结论,可以了解整个初始化过程。
【讨论】:
以上是关于为 Rails 加载配置文件的顺序是啥?的主要内容,如果未能解决你的问题,请参考以下文章
在 Rails 应用程序中存储 Configatron 配置的正确/最佳位置是啥?