Что значит 'require: false' в Gemfile? - PullRequest
399 голосов
/ 26 января 2011

Означает ли это:

gem 'whenever', require: false

означает, что драгоценный камень необходимо установить, или это означает, что он не требуется?

Ответы [ 5 ]

447 голосов
/ 26 января 2011

Это означает, что нужно установить гем, но не вызывать require при запуске Bundler. Так что вам нужно будет вручную позвонить

require "whenever"

, если вы хотите использовать библиотеку.

Если бы вы сделали

gem "whenever", require: "whereever"

тогда bundler будет загружать гем, названный в любое время, но будет вызывать

require "whereever"

Это часто используется, если имя нужной библиотеки отличается от имени драгоценного камня.

69 голосов
/ 26 января 2011

Вы используете :require => false, когда хотите, чтобы камень был установлен, но не "требуется".

Итак, в приведенном вами примере: gem 'whenever', :require => false когда кто-то запускает пакетную установку, всякий раз, когда gem устанавливается, как при gem install whenever.Всякий раз, когда используется для создания заданий cron путем запуска задачи rake, но обычно не используется из приложения rails (или другой среды, если не rails).

Таким образом, вы можете использовать :require => false для всего, что вам нужнозапускаться из командной строки, но не нужно в вашем коде.

55 голосов

require: false говорит Bundler.require не требовать этого конкретного драгоценного камня: драгоценный камень должен требоваться явно через require 'gem'.

Эта опция не влияет:

  • bundle install: камень будет установлен независимо от

  • require настройка пути поиска по пакетам.

    Bundler добавляет вещи на путь, когда вы делаете одно из:

    • Bundle.setup
    • который называется require bundler/setup
    • который называется bundle exec

Пример

Gemfile

source 'https://rubygems.org'
gem 'haml'
gem 'faker', require: false

main.rb

# Fail because we haven't done Bundler.require yet.
# bundle exec does not automatically require anything for us,
# it only puts them in the require path.
begin Haml; rescue NameError; else raise; end
begin Faker; rescue NameError; else raise; end

# The Bundler object is automatically required on `bundle exec`.
Bundler.require

Haml
# Not required because of the require: false on the Gemfile.
# THIS is what `require: false` does.
begin Faker; rescue NameError; else raise; end

# Faker is in the path because Bundle.setup is done automatically
# when we use `bundle exec`. This is not affected by `require: false`.
require 'faker'
Faker

Тогда следующее не вызовет исключения:

bundle install --path=.bundle
bundle exec ruby main.rb

На GitHub для вас, чтобы играть с ним.

Использование рельсов

Как объяснено в руководстве по инициализации , шаблон Rails по умолчанию запускается при запуске:

  • config/boot.rb
  • config/application.rb

config/boot.rb содержит:

ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__)
require 'bundler/setup' if File.exists?(ENV['BUNDLE_GEMFILE'])

, который выполняет require 'bundler/setup' и устанавливает требуемый путь.

config/application.rb делает:

Bundler.require(:default, Rails.env)

, что на самом деле требует драгоценных камней.

8 голосов
/ 26 февраля 2016

Всякий раз, когда вы указываете Gem в вашем Gemfile и запускаете bundle install, компоновщик запускает и устанавливает указанный гем и загружает код для этого Gem в ваше приложение, помещая require 'whenever' таким образом, компоновщик будет загружать код для всех ваших Gems в вашем Rails-приложении, и вы можете безболезненно вызывать любой метод из любого Gem, как вы это делаете большую часть времени.

но Gems вроде whenever, faker or capistrano - это то, что вам не нужно в коде вашего приложения, которое вам нужно всякий раз, когда код в файле schedule.rb используется для управления кодами и кодами capistrano в файле deploy.rb для настройки рецепта развертывания, поэтому вам не нужно загрузить код для этих драгоценных камней в коде вашего приложения и где бы вы ни захотели вызвать какой-либо метод из этих самоцветов, вы сами можете вручную потребовать эти самоцветы, введя require "whenever" . таким образом, вы помещаете :require => false в свой Gemfile для этих Gems, таким образом, упаковщик будет устанавливать этот Gem, но не загружать код для этого самого Gem, вы можете сделать это в любое время, просто вставив в вашем случае команду like require когда угодно.

1 голос
/ 09 марта 2018

Для того, чтобы требовать драгоценные камни в вашем Gemfile, вам нужно позвонить Bundler.require.

Вы можете запретить сборщику требовать драгоценный камень с помощью require: false, но он все равно будет устанавливать и поддерживать драгоценный камень.Проверьте это для более подробного объяснения.

...