bundle-exec - Jalankan perintah dalam konteks bundel
bundle exec [--keep-file-descriptors] command
Perintah ini menjalankan perintah, membuat semua permata yang ditentukan dalam [Gemfile(5)][Gemfile(5)] tersedia untuk diperlukan dalam program Ruby.
Intinya, jika Anda biasanya menjalankan sesuatu seperti rspec spec/my_spec.rb, dan Anda ingin menggunakan permata yang ditentukan di [Gemfile(5)][Gemfile( 5)] dan diinstal melalui bundle install(1) bundle-install.1.html, Anda harus menjalankan bundle exec rspec spec/my_spec.rb.
Perhatikan bahwa bundle exec tidak mengharuskan file yang dapat dieksekusi tersedia di ` PATH shell Anda.
Exec di Ruby 2.0 mulai membuang deskriptor file non-standar. Saat flag ini diteruskan, exec akan kembali ke perilaku 1.9 dengan meneruskan semua deskriptor file ke proses baru.
Jika Anda menggunakan flag --binstubs di bundle install(1) bundle-install.1.html, Bundler akan secara otomatis membuat direktori (yang defaultnya adalah app_root/bin) yang berisi semua executable yang tersedia dari permata dalam bundel.
Setelah menggunakan --binstubs, bin/rspec spec/my_spec.rb identik dengan bundle exec rspec spec/my_spec.rb.
bundle exec membuat sejumlah perubahan pada lingkungan shell, lalu mengeksekusi perintah yang Anda tentukan secara penuh.
pastikan masih memungkinkan untuk membayar bundel dari dalam perintah yang dijalankan oleh bundel exec (menggunakan $BUNDLE_BIN_PATH)
letakkan direktori yang berisi executable (seperti rails, rspec, rackup) untuk bundel Anda di ` PATH
pastikan bahwa jika bundler dipanggil di subkulit, itu menggunakan Gemfile yang sama (dengan menyetel BUNDLE_GEMFILE)
tambahkan -rbundler/setup ke $RUBYOPT, yang memastikan bahwa program Ruby yang dipanggil di subkulit dapat melihat permata di bundel
Itu juga memodifikasi Rubygems:
larang memuat permata tambahan yang tidak ada dalam bundel
ubah metode gem menjadi no-op jika permata yang cocok dengan persyaratan ada dalam bundel, dan untuk memunculkan Gem::LoadError jika tidak
Tetapkan Gem.refresh sebagai tanpa pengoperasian, karena indeks sumber selalu dibekukan saat menggunakan bundler, dan untuk mencegah permata dari sistem bocor ke lingkungan
Ganti Gem.bin_path untuk menggunakan permata dalam bundel, membuat sistem yang dapat dijalankan berfungsi
Tambahkan semua permata dalam bundel ke dalam Gem.loaded_specs
Terakhir, bundle exec juga secara implisit memodifikasi Gemfile.lock jika lockfile dan Gemfile tidak cocok. Bundler memerlukan Gemfile untuk menentukan hal-hal seperti grup permata, persyaratan otomatis, dan platform, dll., dan informasi tersebut tidak disimpan di file kunci. Gemfile dan lockfile harus disinkronkan agar bundle exec berhasil, jadi bundle exec mengupdate lockfile terlebih dahulu.
Secara default, ketika mencoba untuk bundel exec ke file dengan shebang ruby, Bundler akan Kernel.memuat file itu alih-alih menggunakan Kernel.exec . Untuk sebagian besar kasus, ini merupakan peningkatan kinerja. Dalam beberapa kasus yang jarang terjadi, hal ini dapat menyebabkan beberapa efek samping yang tidak kentara (seperti ketergantungan pada konten tepat dari $0 atau __FILE__) dan pengoptimalan dapat dinonaktifkan dengan mengaktifkan pengaturan disable_exec_load.
Setiap kode Ruby yang membuka subkulit (seperti system, backticks, atau %x{}) akan secara otomatis menggunakan lingkungan Bundler saat ini. Jika Anda perlu menggunakan perintah Ruby yang bukan bagian dari bundel Anda saat ini, gunakan metode with_unbundled_env dengan blok. Setiap subkulit yang dibuat di dalam blok akan diberikan lingkungan yang ada sebelum Bundler diaktifkan. Misalnya, perintah Homebrew menjalankan Ruby, tetapi tidak berfungsi di dalam bundel:
Bundler.with_unbundled_env do
`brew install wget`
endMenggunakan with_unbundled_env juga diperlukan jika Anda menggunakan bundel lain. Setiap perintah Bundler yang dijalankan dalam subkulit akan mewarisi Gemfile saat ini, sehingga perintah yang perlu dijalankan dalam konteks bundel yang berbeda juga perlu menggunakan with_unbundled_env.
Bundler.with_unbundled_env do
Dir.chdir "/other/bundler/project" do
`bundle exec ./script`
end
endBundler menyediakan bantuan praktis yang menggabungkan sistem dan exec, dan dapat digunakan seperti ini:
Bundler.clean_system('brew install wget')
Bundler.clean_exec('brew install wget')Saat ini, sistem plugin Rubygems memerlukan semua file bernama rubygems_plugin.rb pada jalur pemuatan setiap permata yang diinstal ketika kode Ruby apa pun memerlukan rubygems.rb . Ini termasuk executable yang diinstal ke dalam sistem, seperti rails, rackup, dan rspec.
Karena plugin Rubygems dapat berisi kode Ruby arbitrer, mereka biasanya mengaktifkan dirinya sendiri atau dependensinya.
Misalnya, permata gemcutter 0.5 bergantung pada json_pure. Jika Anda menginstal versi gemcutter tersebut (bahkan jika Anda juga memiliki versi yang lebih baru tanpa masalah ini), Rubygems akan mengaktifkan gemcutter 0.5 dan json_pure
Jika Gemfile(5) Anda juga berisi json_pure (atau permata dengan ketergantungan pada json_pure), versi terbaru di sistem Anda mungkin bertentangan dengan versi di Gemfile Anda(5 ), atau versi snapshot di Gemfile.lock Anda.
Jika ini terjadi, bundler akan berkata:
You have already activated json_pure 1.4.6 but your Gemfile
requires json_pure 1.4.3. Consider using bundle exec.Dalam situasi ini, Anda hampir pasti ingin menghapus permata yang mendasarinya dengan plugin permata yang bermasalah. Secara umum, pembuat plugin ini (dalam hal ini, permata gemcutter) telah merilis versi terbaru yang lebih berhati-hati dalam plugin mereka.
Anda dapat menemukan daftar semua permata yang berisi plugin permata dengan menjalankan
ruby -e "puts Gem.find_files('rubygems_plugin.rb')"Paling tidak, Anda harus menghapus semua kecuali versi terbaru dari setiap plugin permata, dan juga menghapus semua plugin permata yang tidak Anda gunakan (gem uninstall gem_name).