Ruby: ¿Qué significa 'requerir: falso' en Gemfile?
Haz esto:
gem 'whenever', require: false
¿Significa que es necesario instalar la gema o significa que no es necesaria?
Esto significa instalar la gema, pero no llamar a require cuando inicie Bundler. Entonces necesitarás llamar manualmente
require "whenever"
si quieres usar la biblioteca.
Si tuvieras que hacer
gem "whenever", require: "whereever"
entonces el paquete descargaría la gema nombrada en cualquier momento, pero llamaría
require "whereever"
Esto se usa a menudo si el nombre de la biblioteca requerida es diferente al nombre de la gema.
Se utiliza :require => false
cuando desea que la gema se instale pero no sea "obligatoria".
Entonces, en el ejemplo que diste:
gem 'whenever', :require => false
cuando alguien ejecuta la instalación del paquete, la gema siempre se instalará como con gem install whenever
. Siempre se usa para crear trabajos cron ejecutando una tarea rake, pero generalmente no se usa desde la aplicación Rails (u otro marco, si no Rails).
Por lo tanto, puede usarlo :require => false
para cualquier cosa que necesite ejecutar desde la línea de comando pero que no necesite dentro de su código.
require: false
indica Bundler.require
que no se requiera esa gema específica: la gema debe solicitarse explícitamente a través de require 'gem'
.
Esta opción no afecta:
bundle install
: la gema se instalará independientementela
require
ruta de búsqueda configurada por paquete.Bundler agrega cosas a la ruta cuando haces cualquiera de las siguientes cosas:
Bundle.setup
- que es llamado por
require bundler/setup
- que es llamado por
bundle exec
Ejemplo
Archivo de gemas
source 'https://rubygems.org'
gem 'haml'
gem 'faker', require: false
principal.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
Entonces lo siguiente no generará excepciones:
bundle install --path=.bundle
bundle exec ruby main.rb
En GitHub para que juegues con él.
Uso de rieles
Como se explica en el tutorial de inicialización , la plantilla Rails predeterminada se ejecuta al inicio:
config/boot.rb
config/application.rb
config/boot.rb
contiene:
ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__)
require 'bundler/setup' if File.exists?(ENV['BUNDLE_GEMFILE'])
que hace require 'bundler/setup'
y configura la ruta requerida.
config/application.rb
hace:
Bundler.require(:default, Rails.env)
que en realidad requiere las gemas.