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

336

Строка следующая:

gem 'whenever', :require => false

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

  • 0
    Большинство ответов (включая принятый) касаются Rails, которые, как я понимаю, делают Bundler.require по умолчанию. Только ответы Сиро и Нешы верны.
Теги:
bundler
gemfile

4 ответа

386
Лучший ответ

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

require "whenever"

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

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

gem "whenever", :require=>"whereever"

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

require "whereever"

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

  • 0
    Огромное спасибо.
  • 7
    Это сделано из соображений производительности?
Показать ещё 9 комментариев
59

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

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

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

  • 6
    Это также может быть использовано для драгоценного камня, который вы используете только в небольшом подмножестве запросов.
33

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, чтобы вы могли играть с ним.

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

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

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

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

  • 3
    Это отличный источник информации. Спасибо!
  • 0
    Я не получил пример Faker / Haml, не могли бы вы уточнить, какие команды вызывают ошибки?
Показать ещё 4 комментария
8

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню