в чем разница между 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 драгоценные камни, принадлежащие каждой из этих групп, и требовать вызова на каждом из драгоценных камней, которые он находит.