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