Risposte:
Questo significa installare la gemma, ma non chiamare Require quando si avvia Bundler. Quindi dovrai chiamare manualmente
require "whenever"
se vuoi usare la libreria.
Se dovessi farlo
gem "whenever", require: "whereever"
quindi il bundler scaricava la gemma chiamata ogni volta, ma chiamava
require "whereever"
Questo viene spesso usato se il nome della libreria da richiedere è diverso dal nome della gemma.
:require => false
queste gemme particolari ed esplicitamente require "thegem"
dal compito del rastrello. Ciò risparmierebbe quindi memoria nei principali processi dell'app e nei tempi di avvio, ecc. Le prestazioni dell'app, tuttavia, non dovrebbero essere influenzate anche se sono necessarie queste gemme aggiuntive in ogni processo.
require 'yaml'
, ora hai il YAML
modulo come oggetto in memoria.
:require => false
e poi nel tuo codice hai unrequire 'library_name_here'
Si utilizza :require => false
quando si desidera installare la gemma ma non "richiesto".
Quindi nell'esempio che hai dato:
gem 'whenever', :require => false
quando qualcuno esegue bundle installa il gemma ogni volta che verrebbe installato come con gem install whenever
. Ogni volta che viene utilizzato per creare processi cron eseguendo un'attività rake ma di solito non viene utilizzato dall'applicazione rails (o altro framework se non rails).
Quindi puoi usarlo :require => false
per tutto ciò che devi eseguire dalla riga di comando ma che non è necessario nel tuo codice.
require: false
dice di Bundler.require
non richiedere quella gemma specifica: la gemma deve essere richiesta esplicitamente tramite require 'gem'
.
Questa opzione non influisce su:
bundle install
: la gemma verrà installata indipendentemente
il require
percorso di ricerca impostato dal bundler.
Il bundler aggiunge elementi al percorso quando si esegue una delle seguenti operazioni:
Bundle.setup
require bundler/setup
bundle exec
Esempio
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
Quindi quanto segue non genererà eccezioni:
bundle install --path=.bundle
bundle exec ruby main.rb
Su GitHub per farti giocare.
Utilizzo delle rotaie
Come spiegato nel tutorial di inizializzazione , il modello Rails predefinito viene eseguito all'avvio:
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'])
che esegue require 'bundler/setup'
e imposta il percorso richiesto.
config/application.rb
fa:
Bundler.require(:default, Rails.env)
che in realtà richiede le gemme.
require 'faker
potrebbe non utilizzare la versione gem corretta, in particolare se Gemfile punta a un riferimento git.
Ogni volta che specifichi una gemma nella tua Gemfile
ed esegui bundle install
, il bundler andrà ad installare la gemma specificata e caricherà il codice per quella gemma nella tua app mettendo in require 'whenever'
questo modo il bundler caricherà il codice per tutte le gemme nella tua app Rails e potrai chiamare qualsiasi metodo da qualsiasi gemma senza alcun dolore, come fai la maggior parte delle volte.
ma le gemme come whenever, faker or capistrano
sono qualcosa di cui non hai bisogno nel codice dell'app che ti serve ogni volta che il codice nel schedule.rb
file per gestire i croni e il codice capistrano nel deploy.rb
file per personalizzare la ricetta di distribuzione, quindi non è necessario caricare il codice per queste gemme nel codice dell'app e ovunque tu sia vuoi chiamare qualsiasi metodo da queste gemme che puoi richiedere manualmente queste gemme da solo mettendo require "whenever"
. quindi inserisci il :require => false
tuo Gemfile per queste gemme, in questo modo il bundler installerà quella gemma ma non caricherà il codice per quella gemma stessa, puoi farlo ogni volta che vuoi semplicemente inserendo come "quando" nel tuo caso.
Per richiedere le gemme nel tuo Gemfile, dovrai chiamare Bundler.require
.
Puoi impedire al bundler di richiedere la gemma require: false
, ma installerà e manterrà comunque la gemma. Dai un'occhiata per una spiegazione più dettagliata.
Bundler.require
impostazioni predefinite come ho capito. Solo le risposte di Ciro e Nesha sono corrette.