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

429

Haz esto:

gem 'whenever', require: false

significa que la gema necesita ser instalada, o significa que no es necesaria?

rafamvc
fuente
1
La mayoría de las respuestas (incluida la aceptada) son sobre Rails que lo hacen Bundler.requirepor defecto, según tengo entendido. Solo las respuestas de Ciro y Nesha son correctas.
Nakilon

Respuestas:

472

Esto significa instalar la gema, pero no llame a require cuando inicie Bundler. Por lo tanto, deberá llamar manualmente

require "whenever"

si quieres usar la biblioteca

Si tuvieras que hacer

gem "whenever", require: "whereever"

entonces bundler descargaría la gema nombrada cada vez, pero llamaría

require "whereever"

Esto se usa a menudo si el nombre de la biblioteca que se requiere es diferente al nombre de la gema.

Rob Di Marco
fuente
112
@VenkatD. a veces quieres instalar ciertas gemas pero no quieres cargarlas en cada proceso. Tengo una tarea de rastrillo particular que quiero invocar periódicamente en Heroku a través de su complemento planificador. Esta tarea de rastrillo en particular requiere ciertas gemas que el resto de la aplicación no necesita. Así que :require => falseestas gemas particulares y explícitamente require "thegem"de la tarea de rastrillo. Esto ahorraría memoria en los procesos principales de la aplicación y el tiempo de inicio, etc. Sin embargo, el rendimiento de la aplicación no debería verse afectado incluso si necesita estas gemas adicionales en cada proceso.
Michael van Rooijen
55
@MichaelvanRooijen: excelentes puntos, sin embargo: "El rendimiento de la aplicación, sin embargo, no debería verse afectado incluso si necesita estas gemas adicionales en cada proceso". No creo que sea verdad. La asignación de objetos requiere trabajo, y el GC tiene que revisarlos
Nathan Long
1
@MichaelvanRooijen: en la práctica, tiene razón, generalmente no importará a menos que use la biblioteca. Pero requerir una gema al menos cargará su archivo principal en lib, y probablemente requiera más. Incluso si usted require 'yaml', ahora tiene el YAMLmódulo como un objeto en la memoria.
Nathan Long
2
¿Qué sucede si desea establecer require en false y el nombre de la biblioteca también es diferente al nombre de la gema?
Peter-Jan Celis
2
@ Peter-JanCelis En ese caso, simplemente establecería :require => falsey luego en su código tendría unrequire 'library_name_here'
Rob Di Marco
73

Se usa :require => falsecuando se desea instalar la gema pero no se "requiere".

Entonces, en el ejemplo que diste: gem 'whenever', :require => false cuando alguien ejecuta un paquete, instala la gema siempre que se instale como con gem install whenever. Siempre que se usa para crear trabajos cron ejecutando una tarea de rastrillo, pero generalmente no se usa desde la aplicación de rieles (u otro marco si no rieles).

Por lo tanto, puede usarlo :require => falsepara cualquier cosa que necesite ejecutar desde la línea de comandos pero que no necesita dentro de su código.

gduq
fuente
66
Esto también podría usarse para una gema que solo usa en un pequeño subconjunto de solicitudes.
Nathan Long
61

require: falsele dice que Bundler.requireno requiera esa gema específica: la gema debe ser requerida explícitamente mediante require 'gem'.

Esta opción no afecta:

  • bundle install: la gema se instalará independientemente

  • La requireconfiguración de la ruta de búsqueda por paquete.

    Bundler agrega cosas al camino cuando haces cualquiera de:

    • Bundle.setup
    • que es llamado por require bundler/setup
    • que es llamado por bundle exec

Ejemplo

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

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 predeterminada de Rails 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.

Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
fuente
Tenga en cuenta que el uso require 'fakerpodría no usar la versión de gema correcta, específicamente si su Gemfile apunta a una referencia de git.
dazonic
@dazonic ¿Haml es diferente en el ejemplo?
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
9

Siempre que especifiques una Gema en tu Gemfiley bundle installejecutes, el bundler irá e instalará la gema especificada y el código de carga para esa Gema en tu aplicación al poner de require 'whenever'esta manera el bundler cargará el código de todas tus Gemas en tu aplicación Rails, y puedes llamar a cualquier método de cualquier gema sin dolor, como lo haces la mayoría de las veces.

pero las gemas whenever, faker or capistrano son algo que no necesita en el código de su aplicación, lo necesita siempre que codifique en su schedule.rb archivo para administrar crons y código capistrano en el deploy.rb archivo para personalizar la receta de implementación, por lo que no necesita cargar el código para estas gemas en el código de su aplicación y donde sea que desea llamar a cualquier método desde estas Gemas, puede solicitar manualmente estas gemas usted mismo al ponerlas require "whenever" . así que pones :require => falseen tu Gemfile para estas Gemas, de esta manera el paquete instalará esa Gema pero no cargará el código para esa Gema en sí, puedes hacerlo cuando quieras simplemente colocando como require 'siempre' en tu caso.

Subhash Chandra
fuente
2

Para requerir gemas en su Gemfile, deberá llamar Bundler.require.

Puede evitar que el bundler requiera la gema require: false, pero aún así la instalará y mantendrá. Mira esto para una explicación más detallada.

Nesha Zoric
fuente