Является ли это:
gem 'whenever', require: false
означает, что драгоценный камень нужно установить, или это значит, что он не требуется?
Является ли это:
gem 'whenever', require: false
означает, что драгоценный камень нужно установить, или это значит, что он не требуется?
Это означает установку гема, но не вызывать require при запуске Bundler. Так что вам нужно будет вручную позвонить
require "whenever"
если вы хотите использовать библиотеку.
Если бы ты сделал
gem "whenever", require: "whereever"
тогда сборщик будет загружать драгоценный камень с именем в любое время, но будет вызывать
require "whereever"
Это часто используется, если имя требуемой библиотеки отличается от имени драгоценного камня.
:require => false
именно эти драгоценные камни и явно require "thegem"
из задачи рейка. Это позволит сэкономить память в основных процессах приложения и времени запуска и т. Д. Однако производительность приложения не должна снизиться, даже если вам требуются эти дополнительные драгоценные камни в каждом процессе.
- person Michael van Rooijen; 15.08.2012
:require => false
или нет. Даже если вам нужен драгоценный камень, но на самом деле он не создает экземпляры объектов, это не имеет значения и потенциально влияет только на время загрузки для загрузки базы кода для этого драгоценного камня. Например. Post.limit(100_000).map(&:title)
снижает производительность, поэтому вы этого не делаете. Однако эти методы доступны в памяти. Вместо этого вы бы сделали Post.limit(100_000).pluck(:title)
. Я, конечно, согласен с тем, что если вы на самом деле / используете / добавляете драгоценные камни, это будет замедляться.
- person Michael van Rooijen; 17.10.2013
require 'yaml'
, теперь у вас есть модуль YAML
как объект в памяти.
- person Nathan Long; 17.10.2013
:require => false
, а затем в вашем коде указать require 'library_name_here'
- person Rob Di Marco; 05.01.2014
gem 'guard-rspec', require: false
в Guardfile, Per github.com/guard/guard-rspec
- person Emeka; 25.02.2016
Вы используете :require => false
, когда хотите, чтобы гем был установлен, но не "обязателен".
Итак, в приведенном вами примере: gem 'whenever', :require => false
когда кто-то запускает пакет, устанавливайте каждый раз, когда гем будет установлен, как с gem install whenever
. Каждый раз используется для создания заданий cron путем выполнения задачи rake, но обычно не используется из приложения rails (или другой структуры, если не rails).
Таким образом, вы можете использовать :require => false
для всего, что вам нужно запустить из командной строки, но не нужно в вашем коде.
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)
что на самом деле требует драгоценных камней.
require 'faker
может не использовать правильную версию гема, особенно если ваш Gemfile указывает на ссылку git.
- person dazonic; 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'.
Чтобы требовать драгоценные камни в вашем Gemfile, вам нужно будет вызвать Bundler.require
.
Вы можете запретить сборщику требовать гем с помощью require: false
, но он все равно будет устанавливать и поддерживать гем. Ознакомьтесь с этим для получения более подробного объяснения.
Bundler.require
. Правильны только ответы Чиро и Неши. - person Nakilon   schedule 17.09.2018