Что значит 'require: false' в Gemfile?

Является ли это:

gem 'whenever', require: false

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

Ответ 1

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

require "whenever"

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

Если бы вы должны были сделать

gem "whenever", require: "whereever"

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

require "whereever"

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

Ответ 2

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

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

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

Ответ 3

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

Как объяснено в руководстве по инициализации, шаблон 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)

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

Ответ 4

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

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

Ответ 5

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

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