Apa bundle exec rake db:migrate
artinya Atau bundle exec rake <command>
secara umum?
Saya mengerti bahwa bundle
mengurus hal-hal di dalam Gemfile. Saya tahu apa arti kata "exec". Saya mengerti bahwa rake
mempertahankan semua hal berbeda yang dapat Anda lakukan, dan saya tahu itu db:migrate
adalah salah satunya. Aku hanya tidak tahu apa yang dilakukan semua kata-kata ini bersama. Mengapa harus bundle
digunakan untuk mengeksekusi rake
untuk melakukan migrasi database?
sumber
bundle
merupakan perintah yang digunakan oleh Bundler..ruby-gemset
file di root proyek Anda. Ada juga.ruby-version
file yang menetapkan versi ruby Anda jika menggunakan RVM.Anda menjalankan
bundle exec
program. Pembuat program menulisnya ketika versi permata tertentu tersedia. Program Gemfile menentukan versi permata yang pembuatnya putuskan untuk gunakan. Artinya, skrip dibuat untuk berjalan dengan benar terhadap versi permata ini.Gemfile seluruh sistem Anda mungkin berbeda dari Gemfile ini. Anda mungkin memiliki permata yang lebih baru atau lebih tua yang skrip ini tidak dimainkan dengan baik. Perbedaan dalam versi ini dapat memberi Anda kesalahan aneh.
bundle exec
membantu Anda menghindari kesalahan ini. Itu mengeksekusi skrip menggunakan permata yang ditentukan dalam Gemfile skrip daripada Gemfile seluruh sistem. Itu mengeksekusi versi permata tertentu dengan keajaiban alias shell.Lihat lebih lanjut di halaman manual .
Berikut ini contoh Gemfile:
Di sini,
bundle exec
akan menjalankan skrip menggunakan rel versi 2.8.3 dan bukan beberapa versi lain yang Anda mungkin telah menginstal seluruh sistem.sumber
rake db:migrate
keluarbundle exec
maka ia akan mengeksekusi menggunakan sistem Gemfile di mana orang mungkin memiliki rak di 1.5.2 (terbaru)?bundle exec
gunakan "aplikasi khusus", permata lokal di Gemfile aplikasi Anda, danbundle
gunakan "permata khusus mesin", permata global jika Anda melakukannyagem install a_certain_gem
. lokal vs globalIni muncul banyak ketika gemfile.lock Anda memiliki versi berbeda dari permata yang diinstal pada mesin Anda. Anda mungkin mendapatkan peringatan setelah menjalankan rake (atau rspec atau yang lain) seperti:
You have already activated rake 10.3.1, but your Gemfile requires rake 10.1.0. Prepending "bundle exec" to your command may solve this.
Prepending
bundle exec
memberitahu bundler untuk mengeksekusi perintah ini terlepas dari perbedaan versi. Tidak selalu ada masalah, namun, Anda mungkin mengalami masalah.Untungnya, ada permata yang memecahkan ini: rubygems-bundler.
$ gem install rubygems-bundler
$ $ gem regenerate_binstubs
Kemudian coba rake, rspec, atau apa pun lagi.
sumber
Mungkin harus disebutkan, bahwa ada cara untuk menghilangkan
bundle exec
(mereka semua dinyatakan dalam bab 3.6.1 dari Michael Hartls Ruby on Rails Tutorial buku ).Yang paling sederhana adalah cukup menggunakan RVM versi terbaru (> = 1.11.x).
Jika Anda terbatas pada versi RVM sebelumnya, Anda selalu dapat menggunakan metode ini yang juga disebutkan oleh calasyr :
The
bundler_stubs
direktori harus kemudian juga ditambahkan ke dalam.gitignore
berkas.Opsi ketiga adalah menggunakan
rubygems-bundler
permata jika Anda tidak menggunakan RVM:sumber
Ketika Anda langsung menjalankan tugas menyapu atau mengeksekusi file biner permata, tidak ada jaminan bahwa perintah akan berperilaku seperti yang diharapkan. Karena itu mungkin terjadi bahwa Anda sudah memiliki permata yang sama diinstal pada sistem Anda yang memiliki versi mengatakan 1.0 tetapi dalam proyek Anda, Anda memiliki versi yang lebih tinggi mengatakan 2.0. Dalam hal ini Anda tidak dapat memprediksi mana yang akan digunakan.
Untuk menegakkan versi permata yang diinginkan, Anda mengambil bantuan
bundle exec
perintah yang akan mengeksekusi biner dalam konteks bundel saat ini. Itu berarti ketika Anda menggunakan bundle exec, bundler memeriksa versi gem yang dikonfigurasi untuk proyek saat ini dan menggunakannya untuk melakukan tugas.Saya juga telah menulis posting tentang itu yang juga menunjukkan bagaimana kita dapat menghindari menggunakannya dengan menggunakan rintisan bin.
sumber
Saya belum
bundle exec
banyak menggunakan , tetapi sedang menyiapkannya sekarang.Saya memiliki contoh di mana penggaruk yang salah digunakan dan banyak waktu terbuang untuk melacak masalah. Ini membantu Anda menghindarinya.
Berikut cara mengatur RVM sehingga Anda dapat menggunakan
bundle exec
secara default dalam direktori proyek tertentu:https://thoughtbot.com/blog/use-bundlers-binstubs
sumber
Ini berarti menggunakan rake yang diketahui bundler dan merupakan bagian dari Gemfile Anda atas setiap rake yang bundler tidak sadari dan jalankan tugas db: migrasi.
sumber