Pengenalan RVM/rbenv

Pengelola versi Ruby dan penetapan versi Ruby per proyek.

Daftar isi

Satu komputer kerja sering melayani lebih dari satu proyek Ruby, sedangkan proyek yang berbeda dapat menuntut versi Ruby yang berbeda pula. Pengelola versi (version manager) menyelesaikannya dengan menyimpan beberapa versi Ruby sekaligus lalu memilih versi yang sesuai untuk setiap direktori proyek. Topik ini mengenalkan dua pengelola yang banyak digunakan, rbenv dan RVM, beserta mekanisme shim (perantara perintah), gemset (kumpulan gem yang terpisah), dan berkas .ruby-version yang mengikat versi pada proyeknya.

Masalah yang diselesaikan pengelola versi#

Tanpa pengelola versi, satu komputer hanya menggunakan satu instalasi Ruby, sehingga seluruh program dari direktori mana pun dibaca oleh interpreter yang sama.

bash
# menampilkan versi interpreter tunggal yang terpasang
ruby -v
text Keluaran
ruby 3.4.12 (2026-10-23 revision 366f5fdc00) +PRISM [x86_64-linux]

Keluaran di atas menyatakan satu versi aktif, dan versi inilah yang digunakan setiap program Ruby pada komputer tanpa pengelola versi. Keadaan ini menjadi kendala saat dua proyek menuntut versi berbeda, misalnya proyek lama dibangun di atas Ruby 3.1 sedangkan proyek baru menuntut 3.4. Pemutakhiran satu instalasi memaksa kedua proyek berpindah sekaligus dan berisiko merusak program yang belum disiapkan. Kumpulan gem juga berada pada satu direktori untuk seluruh sistem, sehingga dua proyek yang menuntut versi gem yang tidak cocok saling bertentangan. Pengelola versi mengatasi keduanya dengan menyimpan banyak versi Ruby dan memisahkan gemnya per versi.

Cara kerja rbenv#

rbenv mengelola versi dengan menyimpan setiap versi Ruby pada direktori terpisah di bawah ~/.rbenv/versions, lalu menyisipkan shim di posisi terdepan PATH. Shim adalah berkas kecil yang namanya sama dengan perintah asli, seperti ruby, gem, dan irb, sehingga panggilan perintah tersebut diterimanya lebih dahulu. Shim membaca versi yang harus digunakan dari berkas .ruby-version pada direktori saat ini, dan apabila berkas itu tidak ada, versi global diambil dari berkas milik rbenv. Setelah versinya ditentukan, shim meneruskan panggilan ke interpreter versi tersebut.

ruby salam.rbperintah yang diketik pada terminal~/.rbenv/shims/rubyshim menangkap panggilan lebih dahuluVersi dibaca dari .ruby-version pada direktori saat ini,atau dari versi global bila berkas itu tidak ada~/.rbenv/versions/3.4.12/bin/rubyinterpreter versi terpilih yang benar-benar berjalan
Alur pemilihan versi oleh shim rbenv
Gambar di atas menunjukkan seluruh alurnya dalam empat langkah, dari perintah yang diketik hingga interpreter versi terpilih. Konsekuensi mekanisme shim adalah setiap versi memiliki kumpulan gemnya sendiri, karena perintah gem juga melewati shim dan menulis ke direktori gem versi tersebut. rbenv tidak menyertai Ruby, sehingga pemasangannya mengikuti petunjuk pada halaman resminya, dan perintah di bawah ini menampilkan bentuk penggunaannya.

bash
# tidak-dijalankan
# memasang versi Ruby tertentu
rbenv install 3.4.12
# menetapkan versi global bila .ruby-version tidak ditemukan
rbenv global 3.4.12
# menetapkan versi untuk direktori proyek saat ini
rbenv local 3.4.12
# menampilkan versi yang tersedia dan yang sedang aktif
rbenv versions

Perintah rbenv install mengunduh dan membangun satu versi Ruby baru, sedangkan rbenv local menuliskan berkas .ruby-version pada direktori tempat perintahnya dijalankan. Setelah itu, versi yang tercatat di sana otomatis terpilih setiap kali terminal berada pada direktori proyek.

RVM dan gemset#

RVM menggunakan pendekatan yang berbeda, yaitu mengganti lingkungan Ruby sesi terminal secara utuh melalui fungsi shell, bukan melalui shim. Setiap versi disimpan pada ~/.rvm/rubies, dan perintah rvm use mengatur PATH sesi tersebut ke versi yang dipilih. RVM juga menyediakan gemset, yaitu ruang kumpulan gem yang terpisah untuk satu versi Ruby, misalnya 3.4.12@salam, sehingga dua proyek yang menggunakan versi Ruby sama tetapi tuntutan gemnya berbeda tetap dapat dipisahkan. rbenv tidak memiliki gemset, dan isolasi gemnya diserahkan pada Bundler.

bash
# tidak-dijalankan
# memasang versi Ruby tertentu
rvm install 3.4.12
# menggunakan versi tertentu pada sesi terminal
rvm use 3.4.12
# membuat gemset terpisah untuk satu proyek
rvm gemset create salam
# menggabungkan versi dan gemset dalam satu pemilihan
rvm use 3.4.12@salam

Tabel berikut merangkum perbedaan kedua pengelola pada aspek yang paling menentukan.

AspekrbenvRVM
Mekanisme pemilihan versishim pada posisi terdepan PATHfungsi shell yang mengganti lingkungan sesi
Penyimpanan versi~/.rbenv/versions~/.rvm/rubies
Isolasi gemdiserahkan pada Bundlergemset bawaan
Konfigurasi per proyekberkas .ruby-versionberkas .ruby-version

Keduanya menyelesaikan masalah yang sama dengan cara yang berbeda, dan pilihannya biasanya mengikuti kebiasaan tim yang ada. Mekanisme shim rbenv sederhana karena hanya meneruskan panggilan, sedangkan gemset RVM memisahkan gem tanpa alat tambahan.

Berkas .ruby-version dan pemeriksaan versi program#

Berkas .ruby-version adalah penanda versi sebuah proyek yang berisi satu baris nomor versi, tanpa awalan huruf v dan tanpa teks lain.

text Isi berkas .ruby-version
3.4.12

Berkas ini diletakkan pada akar direktori proyek dan dibaca rbenv maupun RVM setiap perintah Ruby dijalankan dari direktori tersebut, sehingga versi proyek ikut berpindah mengikuti direktori kerja. Program yang menuntut versi tertentu dapat memeriksa kecocokannya secara mandiri melalui konstanta bawaan Ruby.

ruby versi-ruby.rb
# versi-ruby.rb: melaporkan versi Ruby yang menjalankan program ini
puts "Ruby #{RUBY_VERSION} pada #{RUBY_PLATFORM}"
puts "Engine: #{RUBY_ENGINE}"
text Keluaran
Ruby 3.4.12 pada x86_64-linux
Engine: ruby
bash
# menjalankan program dari direktori proyek
ruby versi-ruby.rb
text Keluaran
Ruby 3.4.12 pada x86_64-linux
Engine: ruby

Konstanta RUBY_VERSION diisi interpreter dengan versinya sendiri saat program berjalan, sehingga laporannya selalu mengikuti versi yang benar-benar aktif, bukan versi yang diharapkan. Program yang menuntut versi minimum dapat membandingkan nilai konstanta ini terlebih dahulu dan berhenti dengan pesan yang jelas apabila versinya kurang.

Ringkasan#

  • Pengelola versi menyimpan beberapa versi Ruby sekaligus dan memilih versinya per direktori proyek.
  • rbenv memilih versi melalui shim yang membaca .ruby-version atau versi global, sedangkan RVM mengganti lingkungan sesi secara utuh dan menyediakan gemset.
  • Berkas .ruby-version berisi satu nomor versi dan dibaca kedua pengelola saat perintah dijalankan dari direktori proyek.
  • Konstanta RUBY_VERSION melaporkan versi interpreter yang sedang menjalankan program.

Referensi#