в чем разница между bundle.setup и bundle.require - PullRequest
10 голосов
/ 19 января 2012

Из справочной страницы gemfile я узнал, что есть два способа импортировать драгоценных камней, указанных в Gemfile.bundle.setup «установит добавление драгоценных камней к пути загрузки Руби», в то время как bundle.require потребует все драгоценные камни.В каком состоянии я должен использовать один из них?

Ответы [ 4 ]

19 голосов
/ 19 января 2012

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).

5 голосов
/ 19 января 2012

Вы должны использовать Bundle.setup, и вы можете использовать Bundle.require.

Основная задача компоновщика - убедиться, что именно Gems, определенные в Gemfile, сделаны видимыми для приложения, то есть все гемы, упомянутые там в точно упомянутых версиях, но не еще одна. Для этого путь загрузки адаптирован. Это сделано Bundle.setup.

Чтобы на самом деле использовать драгоценные камни, они должны быть обязательными и таким образом загружены в приложение. Это можно сделать вручную, используя несколько операторов require, или автоматически для всех драгоценных камней, перечисленных в Gemfile (или только для некоторых групп), используя Bundle.require. Это, однако, возможно только после адаптации пути загрузки, как указано выше.

0 голосов
/ 27 августа 2018

Я отвечу на это в контексте 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 для каждого найденного им драгоценного камня.

0 голосов
/ 10 июля 2017

Bundle.setup не является обязательным для последней версии пакета. на самом деле, когда вы запускаете Bundler.require, он всегда пытается установить правильный $LOAD_PATH для вас.

единственная потребность:

require 'bundler' Bundler.require

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...