Antworten:
Dies bedeutet, dass Sie den Edelstein installieren, aber beim Starten von Bundler nicht erforderlich aufrufen müssen. Sie müssen also manuell anrufen
require "whenever"
wenn Sie die Bibliothek nutzen möchten.
Wenn du es tun würdest
gem "whenever", require: "whereever"
dann würde der Bundler den genannten Edelstein jederzeit herunterladen, aber anrufen
require "whereever"
Dies wird häufig verwendet, wenn sich der Name der gewünschten Bibliothek vom Namen des Edelsteins unterscheidet.
:require => false
diese besonderen Edelsteine und explizit require "thegem"
von der Rechenaufgabe. Dies würde dann Speicher in den Haupt-App-Prozessen und in der Startzeit usw. sparen. Die App-Leistung sollte jedoch nicht beeinträchtigt werden, selbst wenn Sie diese zusätzlichen Juwelen in jedem Prozess benötigen.
require 'yaml'
, haben Sie jetzt das YAML
Modul als Objekt im Speicher.
:require => false
und dann in Ihrem Code einerequire 'library_name_here'
Sie verwenden, :require => false
wenn der Edelstein installiert, aber nicht "erforderlich" sein soll.
In dem Beispiel, das Sie gegeben haben:
gem 'whenever', :require => false
Wenn jemand eine Bundle-Installation ausführt, wird das Wann-Gem wie bei installiert gem install whenever
. Wann immer Cron-Jobs durch Ausführen einer Rake-Task erstellt werden, wird dies normalerweise nicht in der Rails-Anwendung (oder einem anderen Framework, wenn nicht Rails) verwendet.
Sie können also :require => false
alles verwenden, was Sie über die Befehlszeile ausführen müssen, aber nicht in Ihrem Code benötigen.
require: false
sagt Bundler.require
, dass dieser bestimmte Edelstein nicht benötigt werden soll: Der Edelstein muss explizit über benötigt werden require 'gem'
.
Diese Option hat keine Auswirkungen auf:
bundle install
: Der Edelstein wird trotzdem installiert
der require
vom Bundler eingerichtete Suchpfad.
Bundler fügt dem Pfad Dinge hinzu, wenn Sie eine der folgenden Aktionen ausführen:
Bundle.setup
require bundler/setup
bundle exec
Beispiel
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
Dann werden die folgenden Ausnahmen nicht ausgelöst:
bundle install --path=.bundle
bundle exec ruby main.rb
Auf GitHub kannst du damit spielen.
Schienengebrauch
Wie im Initialisierungs-Tutorial erläutert , wird die Standard-Rails-Vorlage beim Start ausgeführt:
config/boot.rb
config/application.rb
config/boot.rb
enthält:
ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__)
require 'bundler/setup' if File.exists?(ENV['BUNDLE_GEMFILE'])
Das macht das require 'bundler/setup'
und richtet den erforderlichen Pfad ein.
config/application.rb
tut:
Bundler.require(:default, Rails.env)
was eigentlich die Edelsteine erfordert.
require 'faker
möglicherweise nicht die richtige Gem-Version verwendet wird, insbesondere wenn Sie Gemfile-Punkte auf eine Git-Referenz verweisen.
Immer wenn Sie einen Edelstein in Ihrer App angeben Gemfile
und ausführen bundle install
, installiert der Bundler den angegebenen Edelstein und lädt den Code für diesen Edelstein in Ihrer App. Auf require 'whenever'
diese Weise lädt der Bundler den Code für alle Ihre Edelsteine in Ihre Rails-App, und Sie können eine beliebige Methode aufrufen von jedem Edelstein ohne Schmerzen, wie Sie es die meiste Zeit tun.
Aber Gems wie whenever, faker or capistrano
sind etwas, das Sie in Ihrem App-Code nicht benötigen. Sie benötigen immer dann Code in Ihrer schedule.rb
Datei, um Crones und Capistrano-Code in der deploy.rb
Datei zu verwalten, um das Bereitstellungsrezept anzupassen, sodass Sie keinen Code für diese Gems in Ihren App-Code laden müssen und wo immer Sie möchten Wenn Sie eine Methode aus diesen Edelsteinen aufrufen möchten, können Sie diese Edelsteine manuell selbst durch Putten anfordern require "whenever"
. :require => false
Wenn Sie also Ihre Gem-Datei für diese Gems eingeben, installiert der Bundler diesen Gem, lädt jedoch keinen Code für diesen Gem selbst. Sie können dies tun, wann immer Sie möchten, indem Sie in Ihrem Fall einfach "require" "when" eingeben.
Um Edelsteine in Ihrer Gemfile zu benötigen, müssen Sie anrufen Bundler.require
.
Sie können verhindern, dass der Bundler den Edelstein mit benötigt, der Edelstein require: false
wird jedoch weiterhin installiert und gewartet. Überprüfen Sie dieses heraus für eine ausführlichere Erklärung.
Bundler.require
nach meinem Verständnis standardmäßig ausgeführt werden. Nur die Antworten von Ciro und Nesha sind richtig.