bundle-exec - manual referensi, opsi, contoh perintah


NAMA

bundle-exec - Jalankan perintah dalam konteks bundel

RINGKASAN

bundle exec [--keep-file-descriptors] command

KETERANGAN

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.

PILIHAN

--keep-file-descriptors

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.

BUNDLE INSTALL --BINSTUBS

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.

MODIFIKASI LINGKUNGAN

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.

Memuat

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.

Menembaki

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`
end

Menggunakan 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
end

Bundler 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')

PLUGIN RUBYGEMS

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).