为 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 加载配置文件的顺序是啥?的主要内容,如果未能解决你的问题,请参考以下文章

dubbo配置文件的加载顺序详解(图示)

在 Rails 中存储应用程序特定配置的最佳方式是啥?

在 Rails 应用程序中存储 Configatron 配置的正确/最佳位置是啥?

10.SpringBoot的配置加载顺序是啥?

Rails 4 - 放置 jQuery 和引导程序的顺序是啥?

nacos配置加载顺序