Apa yang dimaksud dengan 'mengharuskan: salah' dalam Gemfile?

429

Melakukan hal ini:

gem 'whenever', require: false

berarti bahwa permata perlu diinstal, atau apakah itu berarti tidak diperlukan?

rafamvc
sumber
1
Sebagian besar jawaban (termasuk yang diterima) adalah tentang Rails yang melakukan Bundler.requiresecara default seperti yang saya mengerti. Hanya jawaban Ciro dan Nesha yang benar.
Nakilon

Jawaban:

472

Ini berarti menginstal permata, tetapi jangan panggil keharusan ketika Anda memulai Bundler. Jadi, Anda harus menelepon secara manual

require "whenever"

jika Anda ingin menggunakan perpustakaan.

Jika Anda melakukannya

gem "whenever", require: "whereever"

maka bundler akan mengunduh permata bernama kapan saja, tetapi akan menelepon

require "whereever"

Ini sering digunakan jika nama perpustakaan yang diperlukan berbeda dari nama permata.

Rob Di Marco
sumber
112
@VenkatD. terkadang Anda ingin memasang permata tertentu tetapi Anda tidak ingin memuatnya di setiap proses. Saya memiliki tugas menyapu tertentu yang ingin saya panggil secara berkala pada Heroku melalui add-on schedular mereka. Tugas menyapu khusus ini membutuhkan permata tertentu yang tidak dibutuhkan oleh aplikasi lainnya. Jadi saya :require => falsepermata khusus ini dan secara eksplisit require "thegem"dari tugas menyapu. Ini kemudian akan menghemat memori dalam proses aplikasi utama dan waktu mulai dll. Kinerja aplikasi, bagaimanapun, tidak boleh terpengaruh bahkan jika Anda memerlukan permata tambahan ini dalam setiap proses.
Michael van Rooijen
5
@MichaelvanRooijen - poin bagus, namun: "Kinerja aplikasi, bagaimanapun, tidak boleh terpengaruh bahkan jika Anda memerlukan permata tambahan ini dalam setiap proses". Saya pikir itu tidak benar. Mengalokasikan objek membutuhkan kerja, dan GC harus menjalankan semua itu setiap kali, jadi lebih = lambat, menurut confreaks.com/videos/2668-gogaruco2013-mengukur-ruby
Nathan Long
1
@MichaelvanRooijen - Dalam praktiknya, Anda benar, umumnya tidak masalah kecuali jika Anda menggunakan perpustakaan. Tetapi membutuhkan permata setidaknya memuat file utamanya di lib, dan mungkin itu membutuhkan lebih dari itu sendiri. Bahkan jika Anda require 'yaml', Anda sekarang memiliki YAMLmodul sebagai objek di memori.
Nathan Long
2
Bagaimana jika Anda ingin menyetel menjadi false dan nama pustaka juga berbeda dengan nama permata?
Peter-Jan Celis
2
@ Peter-JanCelis Dalam hal ini Anda hanya akan mengatur :require => falsedan kemudian dalam kode Anda memilikirequire 'library_name_here'
Rob Di Marco
73

Anda menggunakan :require => falsesaat Anda ingin permata diinstal tetapi tidak "wajib".

Jadi, dalam contoh yang Anda berikan: gem 'whenever', :require => false ketika seseorang menjalankan bundel, instal permata kapan saja yang akan diinstal gem install whenever. Setiap kali digunakan untuk membuat pekerjaan cron dengan menjalankan tugas menyapu tetapi biasanya tidak digunakan dari dalam rel (atau kerangka kerja lain jika bukan rel) aplikasi.

Jadi Anda dapat menggunakan :require => falseapa pun yang Anda perlu jalankan dari baris perintah tetapi tidak perlu dalam kode Anda.

gduq
sumber
6
Ini juga dapat digunakan untuk permata yang hanya Anda gunakan dalam sebagian kecil permintaan.
Nathan Long
61

require: falsememberitahu Bundler.requireuntuk tidak meminta permata tertentu: permata harus diminta secara eksplisit melalui require 'gem'.

Opsi ini tidak mempengaruhi:

  • bundle install: permata akan diinstal terlepas

  • yang requirepath pencarian setup oleh bundler.

    Bundler menambahkan hal-hal ke jalan ketika Anda melakukan salah satu dari:

    • Bundle.setup
    • yang disebut dengan require bundler/setup
    • yang disebut dengan bundle exec

Contoh

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

Maka yang berikut tidak akan memunculkan pengecualian:

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

Di GitHub untuk Anda mainkan.

Penggunaan rel

Seperti dijelaskan dalam tutorial inisialisasi , template Rails default berjalan saat startup:

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

config/boot.rb mengandung:

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

yang melakukan require 'bundler/setup'dan mengatur path yang diperlukan.

config/application.rb tidak:

Bundler.require(:default, Rails.env)

yang sebenarnya membutuhkan permata.

Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
sumber
Perhatikan bahwa menggunakan require 'fakermungkin tidak menggunakan versi permata yang benar, khususnya jika Anda Gemfile menunjuk ke git ref.
dazonic
@doniconic Haml berbeda pada contoh?
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
9

Setiap kali Anda menentukan Permata di Gemfiledan menjalankan bundle install, bundler akan pergi dan menginstal permata dan memuat kode yang ditentukan untuk Permata di aplikasi Anda dengan menempatkan require 'whenever'cara ini bundler akan memuat kode untuk semua Permata Anda di aplikasi Rails Anda, dan Anda dapat memanggil metode apa pun dari Permata apa pun tanpa rasa sakit, seperti yang sering Anda lakukan.

tetapi Permata seperti whenever, faker or capistrano adalah sesuatu yang Anda tidak perlu dalam kode aplikasi Anda, Anda perlu setiap kali kode dalam schedule.rb file Anda untuk mengelola crons dan kode capistrano dalam deploy.rb file untuk menyesuaikan resep penempatan sehingga Anda tidak perlu memuat kode untuk permata ini dalam kode aplikasi Anda dan di mana pun Anda berada ingin memanggil metode apa pun dari Permata ini, Anda dapat secara manual meminta permata ini sendiri dengan meletakkannya require "whenever" . jadi Anda memasukkan :require => falseGemfile Anda untuk Permata ini, dengan cara ini bundler akan menginstal Permata itu tetapi tidak memuat kode untuk Permata itu sendiri, Anda dapat melakukannya kapan pun Anda inginkan dengan hanya menempatkan seperti memerlukan 'kapan saja' dalam kasus Anda.

Subhash Chandra
sumber
2

Untuk meminta permata di Gemfile Anda, Anda harus menelepon Bundler.require.

Anda dapat mencegah bundler meminta permata require: false, tetapi tetap akan menginstal dan memelihara permata tersebut. Lihat ini untuk penjelasan yang lebih rinci.

Nesha Zoric
sumber