Ruby on rails Rails应用程序中application.rb文件的说明

Ruby on rails Rails应用程序中application.rb文件的说明,ruby-on-rails,Ruby On Rails,我正试图深入了解rails应用程序是如何初始化的。我正在查看config/application.rb文件,我被以下三行弄糊涂了: require_relative 'boot' require 'rails/all' Bundler.require(*Rails.groups) 据我所知,这三行代码都在加载Rails应用程序使用的gemboot.rb像加载Bundler.require(*Rails.groups)一样加载所有gem。为什么需要全部三行代码 require_relativ

我正试图深入了解rails应用程序是如何初始化的。我正在查看config/application.rb文件,我被以下三行弄糊涂了:

require_relative 'boot'

require 'rails/all'

Bundler.require(*Rails.groups)
据我所知,这三行代码都在加载Rails应用程序使用的gemboot.rb像加载Bundler.require(*Rails.groups)一样加载所有gem。为什么需要全部三行代码

require_relative 'boot'
为gems设置绑定器和加载路径

require 'rails/all'
这将加载rails gems。它可以被替换,以便明确地只需要您需要的rails gem(即
需要“操作”\u mailer/railtie


默认情况下,这需要gem文件中列出的gem。如果删除此行,则必须手动要求每个gem。

基本正确,并且您可以通过在Rails应用程序中一次禁用一行来验证“需要”的内容

  • require\u relative'boot'
    :应用程序仍在运行
  • require'rails/all'
    :未在我的gem文件中列出的gem的Method not found错误(其中一个(require'rails/all'))
  • Bundler.require(*Rails.groups)
    :从Gemfile中找不到gem的方法
因此,第二个和第三个是独立的、必不可少的。boot.rb对bundler/setup的调用不能代替其他两个,因为它的功能实际上是通过确保只包含Gemfile gems,而删除所有其他内容来实现。请参阅的最后一行。因此,当应用程序运行时,它可以使用访问您不打算包含的其他gem,并在另一个仅安装Gemfile依赖项的用户可能失败时,给您一种错误的感觉,即应用程序正在工作


因此,在短期内,你可能只会得到第二行和第三行,但肯定会希望其他人在某一天必须执行的任何事情上得到这三行。开销很小,所以我不会删除其中任何一行。

谢谢你姆贝卡。我仍然不明白为什么需要第二行。第三行不包括吗e我们所有的gem?@nflauria不,它只包括gem文件中的gem。我编辑了我的回复,以修复第二项中Rails源代码丢失的链接,其中显示了内置在Rails中的gem。像ActiveRecord、ActiveStorage和ActionMailer这样的gem被广泛使用,并且经常因为这一行而忽略gem文件。
Bundler.require(*Rails.groups)