Ruby: ¿Qué significa 'requerir: falso' en Gemfile?

Resuelto rafamvc asked hace 13 años • 6 respuestas

Haz esto:

gem 'whenever', require: false

¿Significa que es necesario instalar la gema o significa que no es necesaria?

rafamvc avatar Jan 26 '11 08:01 rafamvc
Aceptado

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.

Rob Di Marco avatar Jan 26 '2011 01:01 Rob Di Marco

Se utiliza :require => falsecuando 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 => falsepara cualquier cosa que necesite ejecutar desde la línea de comando pero que no necesite dentro de su código.

gduq avatar Jan 26 '2011 02:01 gduq

require: falseindica Bundler.requireque 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á independientemente

  • la requireruta de búsqueda configurada por paquete.

    Bundler agrega cosas a la ruta cuando haces cualquiera de las siguientes cosas:

    • Bundle.setup
    • que es llamado porrequire bundler/setup
    • que es llamado porbundle 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.rbcontiene:

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.rbhace:

Bundler.require(:default, Rails.env)

que en realidad requiere las gemas.