Строка следующая:
gem 'whenever', :require => false
Означает ли это, что камень необходимо установить или не требуется?
Это означает, что нужно установить драгоценный камень, но не требуйте вызова при запуске Bundler. Поэтому вам нужно будет вручную вызвать
require "whenever"
если вы хотите использовать библиотеку.
Если вы должны были сделать
gem "whenever", :require=>"whereever"
тогда связка будет загружать драгоценный камень, когда-либо, но вызывается
require "whereever"
Это часто используется, если имя требуемой библиотеки отличается от имени драгоценного камня.
Вы используете :require => false
, когда хотите, чтобы камень был установлен, но не "требуется".
Итак, в примере, который вы дали:
gem 'whenever', :require => false
когда кто-то запускает пакет, устанавливайте каждый раз, когда камень будет установлен как с gem install whenever
. Всякий раз, когда используется для создания заданий cron, запуская задачу рейка, но обычно не используется из приложения 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, чтобы вы могли играть с ним.
Как объяснено в учебнике по инициализации, шаблон запуска по умолчанию запускается при запуске:
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)
который фактически требует драгоценных камней.
Всякий раз, когда вы укажете 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, вы можете делать это, когда захотите, просто помещая, как нужно "когда угодно" в вашем случае.
Bundler.require
по умолчанию. Только ответы Сиро и Нешы верны.