我正在努力深入了解rails应用程序的初始化过程。我正在查看config/application.rb文件,但对以下三行内容感到困惑:
require_relative 'boot'
require 'rails/all'
Bundler.require(*Rails.groups)
据我所知,这三行代码都在加载Rails应用程序使用的gems。 boot.rb 和 Bundler.require(*Rails.groups) 都会加载所有的gems。为什么需要这三行代码?
我正在努力深入了解rails应用程序的初始化过程。我正在查看config/application.rb文件,但对以下三行内容感到困惑:
require_relative 'boot'
require 'rails/all'
Bundler.require(*Rails.groups)
基本正确,您可以通过在已工作的Rails应用程序中逐行禁用验证“所需”的内容。
require_relative 'boot'
:应用程序仍在运行。require 'rails/all'
:对于未在Gemfile中列出的gem(其中之一是Rails内置(要求'rails / all')),会出现方法未找到错误。Bundler.require(*Rails.groups)
:对于来自Gemfile的gem,会出现方法未找到的错误。因此,第二和第三个独立且至关重要。boot.rb调用bundler/setup不能替代其他两个,因为它的功能实际上是通过确保只包括Gemfile gems并删除其他所有东西来清理加载路径。请参见Bundler setup源代码的最后一行。因此,虽然应用程序正在运行,但它可能正在访问您没有打算包含的其他gem,给您产生虚假的感觉,即应用程序正在工作,但对于仅安装了Gemfile依赖项的另一个用户,它可能会失败。
因此,在短期内,您可能只需要第二个和第三个内容,但是在任何其他人可能需要执行的情况下,绝对需要全部三个。开销很小,因此不建议删除任何一个。
require_relative 'boot'
设置 Bundler 和 gem 的加载路径
require 'rails/all'
这里加载了Rails的gems。你可以替换它来显式地只需求你需要的Rails gems(例如 require "action_mailer/railtie"
)
Bundler.require(*Rails.groups)
这需要默认在你的Gemfile中列出的gems。如果你删除了这行,就必须手动要求每个gem。