Руби: Что означает «require: false» в Gemfile?

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

gem 'whenever', require: false

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


person rafamvc    schedule 26.01.2011    source источник
comment
Большинство ответов (включая принятый) относятся к Rails, которые, как я понимаю, по умолчанию делают Bundler.require. Правильны только ответы Чиро и Неши.   -  person Nakilon    schedule 17.09.2018


Ответы (5)


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

require "whenever"

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

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

gem "whenever", require: "whereever"

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

require "whereever"

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

person Rob Di Marco    schedule 26.01.2011
comment
@VenkatD. иногда вы хотите установить определенные драгоценные камни, но не хотите загружать их в каждый процесс. У меня есть особая задача с граблями, которую я хочу периодически вызывать на Heroku через их надстройку расписания. Эта конкретная задача рейка требует определенных драгоценных камней, которые остальной части приложения не нужны. Так что я :require => false именно эти драгоценные камни и явно require "thegem" из задачи рейка. Это позволит сэкономить память в основных процессах приложения и времени запуска и т. Д. Однако производительность приложения не должна снизиться, даже если вам требуются эти дополнительные драгоценные камни в каждом процессе. - person Michael van Rooijen; 15.08.2012
comment
Это часто используется, если имя требуемой библиотеки отличается от имени драгоценного камня. - Спасибо! Это помогло мне понять, почему драгоценный камень, который я использовал, не требовался автоматически. - person ErJab; 26.04.2013
comment
@MichaelvanRooijen - отличные моменты, однако: производительность приложения не должна снижаться, даже если вам требуются эти дополнительные драгоценные камни в каждом процессе. Не думаю, что это правда. Распределение объектов требует работы, и сборщик мусора должен каждый раз обрабатывать их все, поэтому больше = медленнее, согласно confreaks.com/videos/2668-gogaruco2013-measuring-ruby - person Nathan Long; 12.10.2013
comment
@NathanLong, если вы действительно / используете / драгоценные камни. Это зависит от того, что вы делаете. Я говорил в контексте использования :require => false или нет. Даже если вам нужен драгоценный камень, но на самом деле он не создает экземпляры объектов, это не имеет значения и потенциально влияет только на время загрузки для загрузки базы кода для этого драгоценного камня. Например. Post.limit(100_000).map(&:title) снижает производительность, поэтому вы этого не делаете. Однако эти методы доступны в памяти. Вместо этого вы бы сделали Post.limit(100_000).pluck(:title). Я, конечно, согласен с тем, что если вы на самом деле / ​​используете / добавляете драгоценные камни, это будет замедляться. - person Michael van Rooijen; 17.10.2013
comment
@MichaelvanRooijen - На практике вы правы, обычно это не имеет значения, если вы не используете библиотеку. Но требуя гем, по крайней мере, загрузится его основной файл в lib, и, вероятно, он сам требует большего. Даже если вы require 'yaml', теперь у вас есть модуль YAML как объект в памяти. - person Nathan Long; 17.10.2013
comment
Что, если вы хотите установить для параметра require значение false, а имя библиотеки также отличается от имени драгоценного камня? - person Peter-Jan Celis; 04.01.2014
comment
@ Peter-JanCelis В этом случае вы должны просто установить :require => false, а затем в вашем коде указать require 'library_name_here' - person Rob Di Marco; 05.01.2014
comment
Одним из таких примеров является гем guard-rspec, согласно инструкциям, которые вы должны включить gem 'guard-rspec', require: false в Guardfile, Per github.com/guard/guard-rspec - person Emeka; 25.02.2016
comment
Имеет ли это значение, если я объявляю драгоценный камень в Gemfile для скрипта ruby, где мне все равно придется вручную запрашивать драгоценные камни? - person Chris Scott; 20.01.2017

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

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

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

person gduq    schedule 26.01.2011
comment
Это также можно использовать для драгоценного камня, который вы используете только в небольшом подмножестве запросов. - person Nathan Long; 12.10.2013

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)

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

person Ciro Santilli 新疆再教育营六四事件ۍ    schedule 10.01.2014
comment
Обратите внимание, что использование require 'faker может не использовать правильную версию гема, особенно если ваш Gemfile указывает на ссылку git. - person dazonic; 02.10.2015
comment
@dazonic - Хамл отличается от примера? - person Ciro Santilli 新疆再教育营六四事件ۍ 02.10.2015

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

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

person Subhash Chandra    schedule 26.02.2016

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

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

person Nesha Zoric    schedule 09.03.2018