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.
@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.
# 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.beginHaml;rescueNameError;else raise;endbeginFaker;rescueNameError;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.beginFaker;rescueNameError;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
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.
Bundler.require
por defecto, según tengo entendido. Solo las respuestas de Ciro y Nesha son correctas.Respuestas:
Esto significa instalar la gema, pero no llame a require cuando inicie Bundler. Por lo tanto, deberá llamar manualmente
si quieres usar la biblioteca
Si tuvieras que hacer
entonces bundler descargaría la gema nombrada cada vez, pero llamaría
Esto se usa a menudo si el nombre de la biblioteca que se requiere es diferente al nombre de la gema.
fuente
:require => false
estas gemas particulares y explícitamenterequire "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.require 'yaml'
, ahora tiene elYAML
módulo como un objeto en la memoria.:require => false
y luego en su código tendría unrequire 'library_name_here'
Se usa
:require => false
cuando 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 congem 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 => false
para cualquier cosa que necesite ejecutar desde la línea de comandos pero que no necesita dentro de su código.fuente
require: false
le dice queBundler.require
no requiera esa gema específica: la gema debe ser requerida explícitamente medianterequire 'gem'
.Esta opción no afecta:
bundle install
: la gema se instalará independientementeLa
require
configuración de la ruta de búsqueda por paquete.Bundler agrega cosas al camino cuando haces cualquiera de:
Bundle.setup
require bundler/setup
bundle exec
Ejemplo
Gemfile
main.rb
Entonces lo siguiente no generará excepciones:
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:que hace
require 'bundler/setup'
y configura la ruta requerida.config/application.rb
hace:que en realidad requiere las gemas.
fuente
require 'faker
podría no usar la versión de gema correcta, específicamente si su Gemfile apunta a una referencia de git.Siempre que especifiques una Gema en tu
Gemfile
ybundle install
ejecutes, el bundler irá e instalará la gema especificada y el código de carga para esa Gema en tu aplicación al poner derequire '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 suschedule.rb
archivo para administrar crons y código capistrano en eldeploy.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 ponerlasrequire "whenever"
. así que pones:require => false
en 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.fuente
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.fuente