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.
@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.
# 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.beginHaml;rescueNameError;else raise;endbeginFaker;rescueNameError;else raise;end# The Bundler object is automatically required on `bundle exec`.Bundler.requireHaml# Not required because of the require: false on the Gemfile.# THIS is what `require: false` does.beginFaker;rescueNameError;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:
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.
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.
Bundler.require
secara default seperti yang saya mengerti. Hanya jawaban Ciro dan Nesha yang benar.Jawaban:
Ini berarti menginstal permata, tetapi jangan panggil keharusan ketika Anda memulai Bundler. Jadi, Anda harus menelepon secara manual
jika Anda ingin menggunakan perpustakaan.
Jika Anda melakukannya
maka bundler akan mengunduh permata bernama kapan saja, tetapi akan menelepon
Ini sering digunakan jika nama perpustakaan yang diperlukan berbeda dari nama permata.
sumber
:require => false
permata khusus ini dan secara eksplisitrequire "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.require 'yaml'
, Anda sekarang memilikiYAML
modul sebagai objek di memori.:require => false
dan kemudian dalam kode Anda memilikirequire 'library_name_here'
Anda menggunakan
:require => false
saat 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 diinstalgem 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 => false
apa pun yang Anda perlu jalankan dari baris perintah tetapi tidak perlu dalam kode Anda.sumber
require: false
memberitahuBundler.require
untuk tidak meminta permata tertentu: permata harus diminta secara eksplisit melaluirequire 'gem'
.Opsi ini tidak mempengaruhi:
bundle install
: permata akan diinstal terlepasyang
require
path pencarian setup oleh bundler.Bundler menambahkan hal-hal ke jalan ketika Anda melakukan salah satu dari:
Bundle.setup
require bundler/setup
bundle exec
Contoh
Gemfile
main.rb
Maka yang berikut tidak akan memunculkan pengecualian:
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:yang melakukan
require 'bundler/setup'
dan mengatur path yang diperlukan.config/application.rb
tidak:yang sebenarnya membutuhkan permata.
sumber
require 'faker
mungkin tidak menggunakan versi permata yang benar, khususnya jika Anda Gemfile menunjuk ke git ref.Setiap kali Anda menentukan Permata di
Gemfile
dan menjalankanbundle install
, bundler akan pergi dan menginstal permata dan memuat kode yang ditentukan untuk Permata di aplikasi Anda dengan menempatkanrequire '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 dalamschedule.rb
file Anda untuk mengelola crons dan kode capistrano dalamdeploy.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 meletakkannyarequire "whenever"
. jadi Anda memasukkan:require => false
Gemfile 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.sumber
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.sumber