в чем разница между bundle.настройка и комплектация.требовать
С страница Gemfile man, я узнал, что есть два способа импорт драгоценные камни, которые вы указали в Gemfile
. The bundle.setup
будет "установка добавляет драгоценные камни в путь загрузки Ruby" в то время как bundle.require
потребуется все драгоценные камни.
в чем разница между этими двумя методами? В каком состоянии я должен использовать один из них?
4 ответов
Bundler.setup
изменяет LOAD_PATH, поэтому вы можете делать такие вещи, как require 'some_gem'
и они будут работать. Это позволяет вам требовать драгоценные камни "вручную". Перед Bundler, используя Rubygems, вы достигнете такого же эффекта, делая require 'rubygems'
.
Bundler.require(:default)
С другой стороны, на самом деле требуется все драгоценные камни в Gemfile (предполагая, что вы не используете группы; в противном случае он требует тех, в указанных группах, если вы предоставляете аргументы). Это стенография для группы require 'some_gem'
заявления.
см.http://gembundler.com/rationale.html. Обратите внимание, что они говорят, что вы должны сделать require 'bundler/setup'
перед Bundler.require
, но на практике этого обычно не требуется. Я почти никогда не использую Bundler.setup
(или require 'bundler/setup
), потому что мне нужны все камни через Bundler.require
).
вы должны использовать Bundle.setup
и вы можете использовать Bundle.require
.
основной смысл bundler состоит в том, чтобы убедиться, что именно драгоценные камни, определенные в Gemfile, сделаны видимыми для приложения, т. е. все драгоценные камни, упомянутые там в точно упомянутых версиях, но не один больше. Для этого адаптируется путь загрузки. Это делается Bundle.setup
.
чтобы фактически использовать драгоценные камни, они должны быть необходимы и, таким образом, загружены в приложение. Это можно сделать вручную с помощью количество require
заявления или автоматически для всех драгоценных камней, перечисленных в Gemfile (или только некоторые группы) с помощью Bundle.require
. Однако это возможно только после адаптации loadpath, как упоминалось выше.
Bundle.setup
не является необходимым для недавно версии bundler.
на самом деле, когда вы бежите Bundler.require
, Он всегда пытается настроить правильно $LOAD_PATH
для вас.
единственная потребность:
require 'bundler'
Bundler.require
Я отвечу на это в контексте Rails. Я просматривал процесс инициализации Rails и наткнулся как на "bundler/setup", так и на Bundler.требовать. Помните цель Bundler: установите драгоценные камни, которые вам нужны, и убедитесь, что это единственные драгоценные камни, необходимые внутри вашего приложения Rails. И вот как это работает с Rails:
при инициализации среда Rails сначала загружает содержимое bin/rails. Для этого требуется два важных файла:
require_relative '../config/boot'
require 'rails/commands'
в config / boot является самым важным здесь. Сначала он сохраняет 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). Затем, он добавляет нагрузку только драгоценных камней в вашем файле.заблокируйте обратно в $LOAD_PATH. Теперь единственные драгоценные камни, из которых вы можете требовать файлы, находятся в вашем Gemfile.
что также интересно, даже если RubyGems имеет значение по умолчанию $LOAD_PATH, которое ищется при использовании "require", вам все равно придется использовать"require". Драгоценные камни уже не требуются. Но когда вы используете Bundler с рельсами, вам не нужно требовать любые камни в Gemfile. Как это достигается? Этим занимается Bundler.требуйте! Обратно в файл 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)
конфиг/приложения.rb запускается после загрузки Rails и в вышеуказанном содержимом, Bundler.требовать требует все драгоценные камни во всех группах вы передаете ему. ("группы"относится к группам, указанным в Gemfile.) Рельсы.группы будут [: default,: development] при запуске Rails в режиме разработки, [: default,: production] в режиме производства и т. д. Группа: по умолчанию включает все драгоценные камни, не перечисленные ни в одной группе. Итак, Bundler будет искать в вашем Gemfile драгоценные камни, принадлежащие каждой из этих групп, и требовать вызова на каждом из драгоценных камней, которые он находит.