Я отвечу на это в контексте Rails.Я просматривал процесс инициализации Rails и наткнулся на «bundler / setup» и Bundler.require.Помните цель Bundler: установите нужные вам драгоценные камни и убедитесь, что это единственные драгоценные камни, необходимые в вашем приложении Rails.Вот как это работает с Rails:
При инициализации среда Rails сначала загружает содержимое bin / rails.Для этого требуются два важных файла:
require_relative '../config/boot'
require 'rails/commands'
Конфигурация / загрузка является наиболее важной здесь.Сначала он сохраняет Gemfile в переменной среды, а затем запускает bundler / setup.
ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__)
require 'bundler/setup' if File.exist?(ENV['BUNDLE_GEMFILE'])
Одна вещь, которую я заметил, очевидно, вы можете выбрать другой Gemfile для использования, установив переменную среды BUNDLE_GEMFILE.Но что еще более важно, из-за 'bundler / setup', $ LOAD_PATH изменяется.Обычно RubyGems имеет $ LOAD_PATH по умолчанию, где он будет искать файлы, когда вы используете «require».Что ж, bundler / setup удаляет все пути к гемам из $ LOAD_PATH (что отменяет любую работу с путями загрузки, которую делал RubyGems).Затем он добавляет пути загрузки только драгоценных камней в вашем Gemfile.lock обратно в $ LOAD_PATH.Теперь единственными камнями, из которых вы можете запрашивать файлы, являются те, что находятся в вашем Gemfile.
Что также интересно, хотя RubyGems имеет значение по умолчанию $ LOAD_PATH, которое ищется при использовании «require», вы все равно должны использовать«требуют».Драгоценные камни уже не требуются.Но когда вы используете Bundler с Rails, вам не нужно требовать никаких самоцветов в Gemfile.Как это достигается?Это обрабатывается Bundler.require!В файле bin / rails есть строка:
APP_PATH = File.expand_path('../../config/application', __FILE__)
APP_PATH только что настроен здесь.Не загруженНо когда вы запускаете что-то вроде rails server, будет использоваться APP_PATH, и, следовательно, будет загружен файл config / application.rb, и, следовательно, следующее:
require 'rails/all'
Bundler.require(*Rails.groups)
config / application.rb запускается после загрузки Rails и вВыше содержимого Bundler.require требуются все драгоценные камни во всех группах, которые вы ему передаете.(«группы» относятся к группам, которые вы указываете в своем Gemfile.) Rails.groups будет [: default,: development], когда вы запускаете Rails в режиме разработки, [: default,: production] в производственном режиме,и так далее.Группа: default включает в себя все драгоценные камни, не перечисленные ни в одной группе.Поэтому Bundler будет искать в вашем Gemfile драгоценные камни, принадлежащие каждой из этих групп, и вызывать require для каждого найденного им драгоценного камня.