488 Stimmen

Rubin: Was bedeutet 'require: false' im Gemfile?

Tut dies:

gem 'whenever', require: false

bedeutet, dass der Edelstein installiert werden muss, oder bedeutet es, dass er nicht erforderlich ist?

523voto

Rob Di Marco Punkte 40364

Das bedeutet, dass Sie den Edelstein installieren, aber require nicht aufrufen, wenn Sie Bundler starten. Also müssen Sie manuell aufrufen

require "whenever"

wenn Sie die Bibliothek nutzen wollen.

Wenn Sie Folgendes tun würden

gem "whenever", require: "whereever"

dann würde Bundler den benannten Edelstein herunterladen, wann auch immer, aber würde die

require "whereever"

Dies wird oft verwendet, wenn der Name der Bibliothek, die benötigt wird, nicht mit dem Namen des Edelsteins übereinstimmt.

84voto

gduq Punkte 1424

Sie verwenden :require => false wenn Sie möchten, dass der Edelstein installiert wird, aber nicht "erforderlich" ist.

In dem von Ihnen genannten Beispiel also: gem 'whenever', :require => false Wenn jemand bundle install ausführt, wird das Gem wann immer installiert, wie bei gem install whenever . Whenever wird verwendet, um Cron-Jobs durch Ausführen eines Rake-Tasks zu erstellen, wird aber normalerweise nicht innerhalb der Rails-Anwendung (oder eines anderen Frameworks, wenn es sich nicht um Rails handelt) verwendet.

Sie können also verwenden :require => false für alles, was Sie von der Kommandozeile aus ausführen müssen, aber nicht in Ihrem Code benötigen.

77voto

require: false sagt Bundler.require diesen speziellen Edelstein nicht zu benötigen: Der Edelstein muss explizit über require 'gem' .

Diese Option bewirkt pas beeinflussen:

  • bundle install : der Edelstein wird trotzdem installiert

  • die require von Bundler eingerichteter Suchpfad.

    Bundler fügt dem Pfad Dinge hinzu, wenn Sie eine der folgenden Aktionen durchführen:

    • Bundle.setup
    • die aufgerufen wird von require bundler/setup
    • die aufgerufen wird von 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 wird das Folgende keine Ausnahmen auslösen:

bundle install --path=.bundle
bundle exec ruby main.rb

Auf GitHub damit Sie damit spielen können.

Rails-Nutzung

Wie in der Initialisierungs-Tutorial wird das Standard-Rails-Template beim Starten 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'])

die die require 'bundler/setup' und richtet den erforderlichen Pfad ein.

config/application.rb tut:

Bundler.require(:default, Rails.env)

die eigentlich die Edelsteine benötigt.

19voto

Subhash Chandra Punkte 2987

Wann immer Sie einen Gem in Ihrer Gemfile und laufen bundle install installiert der Bundler den angegebenen Edelstein und lädt den Code für diesen Edelstein in Ihre Anwendung, indem er require 'whenever' Auf diese Weise lädt Bundler den Code für alle Ihre Gems in Ihrer Rails-Anwendung, und Sie können jede Methode von jedem Gem ohne Probleme aufrufen, wie Sie es die meiste Zeit tun.

aber Edelsteine wie whenever, faker or capistrano sind etwas, das Sie nicht in Ihrem Anwendungscode brauchen, sondern immer dann, wenn Sie Code in Ihrem schedule.rb Datei zur Verwaltung von Crons und Capistrano-Code in deploy.rb Datei, um das Bereitstellungsrezept anzupassen, so dass Sie den Code für diese Edelsteine nicht in Ihren Anwendungscode laden müssen und wo auch immer Sie eine Methode von diesen Edelsteinen aufrufen wollen, können Sie diese Edelsteine selbst manuell anfordern, indem Sie require "whenever" . so setzen Sie :require => false in Ihrer Gemfile für diese Gems, auf diese Weise wird Bundler diese Gem installieren, aber nicht den Code für diese Gem selbst laden, Sie können es tun, wann immer Sie wollen, indem Sie einfach wie require 'whenever' in Ihrem Fall.

6voto

BenKoshy Punkte 29349

Analogie zur Erläuterung

## Gemfile
gem "university_degree", require: false
gem "dealing_with_boss"
  • " dealing_with_boss " - immer gebraucht - in den Speicher geladen und einsatzbereit.

  • Ich brauche das Diplom selten. Nur wenn ich mit Personalverantwortlichen spreche. Deshalb habe ich manuell require und plötzlich sind Begriffe wie "Black Scholes-Merton" und "Heteroskadastizität" sofort parat; ich sage Personalverantwortlichen, dass ich "Bubble Sort" kann.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X