Respuestas:
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.
:require => false
estas 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.
require 'yaml'
, ahora tiene el YAML
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 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 => false
para cualquier cosa que necesite ejecutar desde la línea de comandos pero que no necesita dentro de su código.
require: false
le dice que Bundler.require
no 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 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
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.
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
y bundle 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 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 => 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.
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.
Bundler.require
por defecto, según tengo entendido. Solo las respuestas de Ciro y Nesha son correctas.