Odpowiedzi:
Oznacza to, że zainstaluj klejnot, ale nie wymagaj call podczas uruchamiania Bundlera. Będziesz musiał ręcznie zadzwonić
require "whenever"
jeśli chcesz skorzystać z biblioteki.
Gdybyś miał to zrobić
gem "whenever", require: "whereever"
następnie sprzedawca pobierze klejnot o nazwie za każdym razem, ale zadzwoni
require "whereever"
Jest to często używane, jeśli nazwa wymaganej biblioteki jest inna niż nazwa klejnotu.
:require => false
te szczególne klejnoty i wyraźnie require "thegem"
z zadania rake. Pozwoliłoby to zaoszczędzić pamięć w głównych procesach aplikacji i czasie uruchamiania itp. Nie powinno to jednak wpływać na wydajność aplikacji, nawet jeśli potrzebujesz tych dodatkowych klejnotów w każdym procesie.
require 'yaml'
, masz teraz YAML
moduł jako obiekt w pamięci.
:require => false
a następnie w swoim kodzie miećrequire 'library_name_here'
Używasz, :require => false
gdy chcesz zainstalować klejnot, ale nie jest on „wymagany”.
Tak więc w podanym przez ciebie przykładzie:
gem 'whenever', :require => false
kiedy ktoś uruchomi pakiet, zainstaluj za każdym razem, gdy klejnot zostanie zainstalowany tak jak w przypadku gem install whenever
. Ilekroć jest używany do tworzenia zadań cron poprzez uruchomienie zadania prowizji, ale zwykle nie jest używany z poziomu aplikacji szyn (lub innych struktur, jeśli nie szyn).
Możesz więc używać :require => false
wszystkiego, co musisz uruchomić z wiersza poleceń, ale nie potrzebujesz tego w swoim kodzie.
require: false
mówi, Bundler.require
aby nie wymagać tego konkretnego klejnotu: klejnot musi być wymagany jawnie przez require 'gem'
.
Ta opcja nie wpływa na:
bundle install
: klejnot zostanie zainstalowany niezależnie
require
ustawienie ścieżki przeszukiwania Bundler.
Bundler dodaje rzeczy do ścieżki, gdy wykonasz jedną z następujących czynności:
Bundle.setup
require bundler/setup
bundle exec
Przykład
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
W takim przypadku następujące wyjątki nie spowodują wyjątków:
bundle install --path=.bundle
bundle exec ruby main.rb
Na GitHub możesz grać z nim.
Wykorzystanie szyn
Jak wyjaśniono w samouczku inicjalizacji , domyślny szablon Railsów jest uruchamiany podczas uruchamiania:
config/boot.rb
config/application.rb
config/boot.rb
zawiera:
ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__)
require 'bundler/setup' if File.exists?(ENV['BUNDLE_GEMFILE'])
który wykonuje require 'bundler/setup'
i ustawia wymaganą ścieżkę.
config/application.rb
robi:
Bundler.require(:default, Rails.env)
co tak naprawdę wymaga klejnotów.
require 'faker
może nie używać poprawnej wersji klejnotu, szczególnie jeśli Gemfile wskazuje na ref git.
Za każdym razem, gdy określisz klejnot w swoim programie Gemfile
i uruchomisz go bundle install
, pakujący pójdzie i zainstaluje określony klejnot i załaduje kod dla tego klejnotu w twojej aplikacji, umieszczając w require 'whenever'
ten sposób pakiet załadujący kod dla wszystkich twoich klejnotów w aplikacji Rails, i możesz wywołać dowolną metodę z dowolnego klejnotu bez bólu, tak jak robisz to przez większość czasu.
ale takie klejnoty whenever, faker or capistrano
to coś, czego nie potrzebujesz w kodzie aplikacji, gdy potrzebujesz kodu w schedule.rb
pliku, aby zarządzać cronami i kodem capistrano w deploy.rb
pliku, aby dostosować przepis na wdrożenie, więc nie musisz ładować kodu dla tych klejnotów w kodzie aplikacji i gdziekolwiek jesteś chcesz wywołać dowolną metodę z tych klejnotów, możesz ręcznie wymagać tych klejnotów, umieszczając je require "whenever"
. więc umieścisz :require => false
swój Gemfile dla tych Klejnotów, w ten sposób pakujący zainstaluje ten Klejnot, ale nie załaduje kodu dla tego Klejnotu, możesz to zrobić w dowolnym momencie, po prostu wstawiając opcję „wymagaj” w Twoim przypadku.
Aby wymagać klejnotów w twoim Gemfile, musisz zadzwonić Bundler.require
.
Możesz uniemożliwić bundlerowi wymaganie klejnotu require: false
, ale nadal będzie go instalował i utrzymywał. Sprawdź to, aby uzyskać bardziej szczegółowe wyjaśnienie.
Bundler.require
domyślnie wykonują, jak rozumiem. Tylko odpowiedzi Ciro i Neshy są poprawne.