Rails应用程序中application.rb文件的解释

4

我正在努力深入了解rails应用程序的初始化过程。我正在查看config/application.rb文件,但对以下三行内容感到困惑:

require_relative 'boot'

require 'rails/all'

Bundler.require(*Rails.groups)

据我所知,这三行代码都在加载Rails应用程序使用的gems。 boot.rbBundler.require(*Rails.groups) 都会加载所有的gems。为什么需要这三行代码?
2个回答

4

基本正确,您可以通过在已工作的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依赖项的另一个用户,它可能会失败。

因此,在短期内,您可能只需要第二个和第三个内容,但是在任何其他人可能需要执行的情况下,绝对需要全部三个。开销很小,因此不建议删除任何一个。


谢谢 MBerka。我还不理解第二行为什么需要。第三行不包括我们所有的 gem 吗? - nflauria
@nflauria 不,它只包括Gemfile中的gem。我已经编辑了我的回复,修复了第二个项目中缺少的Rails源链接,该链接显示了内置在Rails中的gems。像ActiveRecord、ActiveStorage和ActionMailer这样的gems被广泛使用,并且通常由于那行代码而被省略在Gemfile中。 - MBer

2
require_relative 'boot'

设置 Bundler 和 gem 的加载路径

require 'rails/all'

这里加载了Rails的gems。你可以替换它来显式地只需求你需要的Rails gems(例如 require "action_mailer/railtie"

Bundler.require(*Rails.groups)

这需要默认在你的Gemfile中列出的gems。如果你删除了这行,就必须手动要求每个gem。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接