Gemfile'da 'gerektirir: yanlış' ne anlama geliyor?


429

Bunu yapar:

gem 'whenever', require: false

Gem'in kurulması gerektiği anlamına mı geliyor, yoksa gerekli olmadığı anlamına mı geliyor?


1
Cevapların çoğu (kabul edilenler dahil) Bundler.requireanladığım kadarıyla varsayılan olarak yapılan Rails ile ilgilidir . Sadece Ciro ve Nesha'nın cevapları doğrudur.
Nakilon

Yanıtlar:


472

Bu gem yüklemek anlamına gelir, ancak Bundler'ı başlattığınızda gerektirir çağırmayın. Bu yüzden manuel olarak aramanız gerekecek

require "whenever"

kütüphaneyi kullanmak istiyorsanız.

Yapacak olsaydın

gem "whenever", require: "whereever"

sonra paketçi ne zaman adlandırılmış mücevher indirir, ama çağırır

require "whereever"

Bu genellikle gereken kitaplığın adı gem'in adından farklıysa kullanılır.


112
@VenkatD. bazen belirli taşları takmak istersiniz, ancak bunları her işleme yüklemek istemezsiniz. Zaman zaman eklentileri aracılığıyla Heroku üzerinde periyodik olarak çağırmak istediğim özel bir komisyon görevim var. Bu özel komisyon görevi, uygulamanın geri kalanının ihtiyaç duymadığı belirli taşlar gerektirir. Bu yüzden :require => falsebu değerli taşlar ve açıkça require "thegem"komisyon görevinden. Bu, daha sonra ana uygulama işlemlerinde ve başlatma zamanında vb. Bellek tasarrufu sağlar. Ancak, her işlemde bu ek mücevherlere ihtiyaç duysanız bile uygulama performansı etkilenmemelidir.
Michael van Rooijen

5
@MichaelvanRooijen - harika noktalar, ancak: "Uygulama performansı, ancak bu ek taşlar her süreçte gerekli olsa bile etkilenmemelidir". Bunun doğru olduğunu düşünmüyorum. Nesnelerin tahsisi işe yarar ve GC her seferinde hepsinden geçmek zorundadır, bu yüzden confreaks.com/videos/2668-gogaruco2013-measuring-ruby
Nathan Long

1
@MichaelvanRooijen - Pratikte haklısınız, kütüphaneyi kullanmazsanız genellikle önemli olmaz. Ancak bir mücevher istemek, en azından ana dosyasını lib'e yükler ve muhtemelen kendi başına daha fazlasını gerektirir. Siz bile require 'yaml', YAMLmodülde artık bellekte bir nesne var.
Nathan Long

2
Ayarlamak istediğiniz yanlışsa ve kitaplık adı da taş adından farklıysa ne olur?
Peter-Jan Celis

2
@ Peter-JanCelis Bu durumda sadece koydunuz :require => falseve kodunuzda birrequire 'library_name_here'
Rob Di Marco

73

Sen kullanmak :require => falseEğer taş yüklü değil istediğiniz zaman "gerekli".

Yani verdiğiniz örnekte: gem 'whenever', :require => false birisi paket çalıştırdığında gem ne zaman kurulursa kurulsun gem install whenever. Bir komisyon görevi çalıştırarak cron işleri oluşturmak için kullanıldığında, ancak genellikle raylar (veya raylar değilse başka bir çerçeve) içinden kullanılmaz.

Böylece :require => falsekomut satırından çalıştırmanız gereken, ancak kodunuz içinde gerekmeyen her şey için kullanabilirsiniz .


6
Bu, yalnızca isteklerin küçük bir alt kümesinde kullandığınız bir mücevher için de kullanılabilir.
Nathan Long

61

require: falseBundler.requireo özel gem gerektirmemesini söyler : gem açıkça yoluyla gerekli olmalıdır require 'gem'.

Bu seçenek yok değil etkiler:

  • bundle install: mücevher ne olursa olsun kurulacak

  • requirebundler tarafından arama yolu kurulumu.

    Bundler, şunlardan birini yaptığınızda yola şeyler ekler:

    • Bundle.setup
    • tarafından çağrılan require bundler/setup
    • tarafından çağrılan bundle exec

Misal

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

O zaman aşağıdakiler istisna doğurmaz:

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

Onunla oynamak için GitHub'da .

Ray kullanımı

Başlatma eğitiminde açıklandığı gibi , varsayılan Rails şablonu başlangıçta çalışır:

  • config/boot.rb
  • config/application.rb

config/boot.rb içerir:

ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__)
require 'bundler/setup' if File.exists?(ENV['BUNDLE_GEMFILE'])

bu require 'bundler/setup'da gerekli yolu yapar ve ayarlar.

config/application.rb yapar:

Bundler.require(:default, Rails.env)

Bu aslında taşlar gerektirir.


require 'fakerÖzellikle Gemfile bir git ref'ye işaret ediyorsanız, kullanmanın doğru gem sürümünü kullanmayabileceğini unutmayın .
dazonic

@dazonic Haml örnekte farklı mıdır?
Ciro Santilli 法轮功 冠状 病 六四 事件 法轮功

9

Ne zaman Gemfileçalıştırırsanız ve çalıştırırsanız bundle install, paketleyici gidip söz konusu Gem için belirtilen mücevher ve yük kodunu uygulamanıza require 'whenever'yükler, bu şekilde paketleyici Rails uygulamanızdaki tüm Mücevherleriniz için kod yükler ve herhangi bir yöntemi çağırabilirsiniz çoğu zaman yaptığınız gibi, herhangi bir Mücevherden herhangi bir acı olmadan.

ancak whenever, faker or capistrano , uygulama tarifinizde, schedule.rb kodları ve capistrano kodunu deploy.rb dağıtım tarifini özelleştirmek için dosyada yönetmek için ihtiyacınız olduğunda uygulama kodunuzda ihtiyacınız olmayan bir şeydir, böylece uygulama kodunuzda ve istediğiniz yerde bu taşlar için kod yüklememeniz gerekir. Bu Mücevherlerden herhangi bir yöntemi çağırmak istiyorsanız, bu cevherleri manuel olarak kendiniz talep edebilirsiniz require "whenever" . bu nedenle :require => falseGemfile'ınızı bu Mücevherler için koyarsınız, bu şekilde paketleyici bu Gem'i yükler, ancak bu Gem'in kendisi için kod yüklemez, istediğiniz zaman 'istediğiniz zaman' istediğiniz gibi koyarak istediğiniz zaman yapabilirsiniz.


2

Gemfile'nizde değerli taşlara ihtiyaç duymak için aramanız gerekir Bundler.require.

Paketleyicinin gem ile ihtiyaç duymasını önleyebilirsiniz require: false, ancak yine de gem'i yükler ve korur. Daha ayrıntılı bir açıklama için buna göz atın .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.