RVM ve rbenv aslında nasıl çalışır?


141

RVM ve rbenv'in gerçekten nasıl çalıştığı ile ilgileniyorum.

Açıkçası Ruby'nin farklı versiyonları ve değerli taşlar arasında geçiş yapıyorlar, ancak bu nasıl elde edilir? Onlar sadece semboller güncelleme vardı, ama kod delved (ve ben Bash bilgimi yüzeysel olduğunu itiraf etmeliyim) onlar daha fazlasını yapıyor gibi görünüyor varsaymıştı.

Yanıtlar:


241

Kısa açıklama: rbenv, ortamınızın içine girerek çalışır PATH. Kavram basit, ama şeytan ayrıntılarda; tam kepçe aşağıda.

İlk olarak, rbenv yaratır şim tüm komutlar için ( ruby, irb, rake, gemvb) Ruby tüm yüklü sürümleri arasında. Bu işleme rehashing denir . Ruby'nin yeni bir sürümünü her yüklediğinizde veya komut sağlayan bir mücevher yüklediğinizde, rbenv rehashyeni komutların yandığından emin olmak için çalıştırın .

Bu şimler tek bir dizinde yaşar ( ~/.rbenv/shimsvarsayılan olarak). Rbenv kullanmak için, shims dizinini yalnızca önünüze eklemeniz gerekir PATH:

export PATH="$HOME/.rbenv/shims:$PATH"

Daha sonra rubykomut satırından her çalıştırdığınızda veya shebang'ın okuduğu bir komut dosyasını çalıştırdığınızda #!/usr/bin/env ruby, işletim sisteminiz ~/.rbenv/shims/rubyilk önce bulabilir ve yükleyebileceğiniz diğer rubyyürütülebilir dosyalar yerine çalıştırır.

Her şim, sırayla çalışan küçük bir Bash betiğidir rbenv exec. Yani yolunuzdaki rbenv irbile eşdeğerdir rbenv exec irbve ruby -e "puts 42"eşdeğerdir rbenv exec ruby -e "puts 42".

rbenv execEğer kullanım istediğiniz Ruby hangi sürümünü komut rakamlar, daha sonra bu sürümün ilgili komutu çalıştırır. Bunu nasıl yapacağınız aşağıda açıklanmıştır:

  1. Eğer RBENV_VERSIONortam değişkeni ayarlanır, değeri kullanımına Ruby sürümünü belirler.
  2. Geçerli çalışma dizininde bir .rbenv-versiondosya varsa, içeriği RBENV_VERSIONortam değişkenini ayarlamak için kullanılır .
  3. .rbenv-versionGeçerli dizinde dosya yoksa , rbenv .rbenv-versiondosya sisteminizin kök dizinine ulaşana kadar her üst dizinde bir dosya arar . Biri bulunursa, içeriği RBENV_VERSIONortam değişkenini ayarlamak için kullanılır .
  4. Eğer RBENV_VERSIONhala ayarlanmazsa, rbenv çalışır içeriğini kullanarak ayarlamak için ~/.rbenv/versiondosyanın.
  5. Hiçbir yerde herhangi bir sürüm belirtilmemişse, rbenv "system" Ruby'yi kullanmak istediğinizi varsayar; yani, rbenv yolunuzda olmasaydı hangi sürümü çalıştırırsınız.

( Geçerli dizinde rbenv localbir .rbenv-versiondosya oluşturan komutla projeye özgü bir Ruby sürümü ayarlayabilirsiniz . Benzer şekilde, rbenv globalkomut ~/.rbenv/versiondosyayı değiştirir .)

Bir donanmış RBENV_VERSIONortam değişkeni, rbenv ekler ~/.rbenv/versions/$RBENV_VERSION/bin, aramalarınızdan önüne PATHdaha sonra geçirilen komuta ve argümanları execs, rbenv exec. İşte bu kadar!

Tam olarak kaputun altında neler olduğuna bakmak için RBENV_DEBUG=1bir Ruby komutu ayarlamayı ve çalıştırmayı deneyin . Rbenv'in çalıştırdığı her Bash komutu terminalinize yazılır.


Şimdi, rbenv sadece anahtarlama sürümleri ile ilgilidir, ancak eklentileri gelişen ekosistem size gelen her şeyi yapmak yardımcı olacaktır Ruby yüklemeden için ortamınızı ayarlama , "gemsets" yönetme ve hatta otomatik halebundle exec .

IRC desteğinin Ruby sürümlerini değiştirmekle ne yapacağından emin değilim ve rbenv, destek gerektirmeyecek kadar basit ve anlaşılır olacak şekilde tasarlanmıştır. Ancak yardıma ihtiyacınız olursa, sorun izleyici ve Twitter yalnızca birkaç tıklama uzaklıktadır.

Açıklama: Ben rbenv, ruby-build ve rbenv-vars'in yazarıyım.


14
Böyle mükemmel bir cevap vermek için zaman ayırdığınız için teşekkür ederiz.
superluminary

2
Vay, böyle anlaşılır ve anlaşılır bir açıklama için teşekkürler. Doğal doğumlu bir öğretmen.
racl101 15:12

Sam, bu cevap iki yaşında olduğu için herhangi bir güncelleme yapmak ister misiniz? Elbette o zamandan beri rbenv'de bir şey değişti.
Nakilon

Hayır! Gördüğüm en iyi hacker açıklaması. Bence orada değiştirilmesi gereken tek güncelleme rbenv-gemset bağlantı (link hala oraya götürecektir. Bu bir yönlendirme sadece bir ekstra adım).
Jeffrey 'jf' Lim

18

Ayrıntılı bir makale yazdım: http://niczsoft.com/2011/11/what-you-should-know-about-rbenv-and-rvm/

Temel fark kabuk ortamının değiştirildiği yerdir:

  • RVM: Ruby'yi değiştirdiğinizde değişiyor.
  • rbenv: Ruby / gem çalıştırılabilir dosyası çalıştırdığınızda değişir.

Ayrıca, RVM ile ilgili şey, sadece Rubies'i yönetmekten çok daha fazlasını kapsar, diğer araçlardan çok daha fazlası vardır (RVM ve rbenv dışında başkaları da vardır: https://twitter.com/#!/mpapis/ durumu / 171714447910502401 )

Freenode sunucularındaki "#rvm" kanalında IRC'ye aldığınız anlık desteği unutmayın.


1
Teşekkürler, her iki toplumdan insanların katılımı gerçekten harika.
superluminary

15

Yukarıdaki mükemmel cevapları özetlemek gerekirse, RVM ve rbenv arasındaki ana pratik fark Ruby'nin sürümünün seçilmesidir.

rbenv:

rbenv, yolunuzun başına Ruby ile aynı ada sahip bir komut ekler. Bir rubykomut satırına yazdığınızda , şim bunun yerine çalıştırılır (çünkü buna "ruby" olarak da adlandırılır ve yolun başında gelir). Şim .rbenv_version, hangi Ruby sürümüne temsil edileceğini bildirmek için bir ortam değişkeni veya dosya arar .

RVM:

RVM, Ruby sürümünü doğrudan arayarak ayarlamanıza olanak tanır rvm use. Ayrıca, cdsistem komutunu da geçersiz kılar . Ne zaman seni cdbir içeren bir klasörün içine .rvmrcdosyanın içinde kod .rvmrcdosyası çalıştırılır. Bu, Ruby sürümünü veya hoşunuza giden başka bir şeyi ayarlamak için kullanılabilir.

Diğer farklılıklar:

Elbette başka farklılıklar da var. RVM, kutunun dışında değerli taşlara sahipken, rbenv'in biraz daha hacklenmesi gerekiyor (ancak çok fazla değil). Her ikisi de soruna işlevsel çözümler.


6

Temel fark , yakutun ne zaman ve nasıl değiştirildiği gibi görünüyor . Ruby değiştirildi:

  • RVM için manuel olarak (rvm kullanımı) veya dizin değiştirme sırasında otomatik olarak
  • rbenv için her ruby ​​komutu yürütüldüğünde

RVM, modifiye edilmiş cdkomut ve Ruby by'ın manuel seçimine güvenir rvm use. rbenv, ruby'yi seçmek için varsayılan mekanizma olarak tüm temel ruby ​​komutları için sarmalayıcılar veya "dolgu" kullanır. RVM, gem, tırmık, yakut gibi temel komut satırı araçları için sarmalayıcılar oluşturur. Onlar Cronjobs (bkz örneğin kullanılan http://rvm.io/integration/cron/ ), ancak bunlar Ruby versiyonunu geçmek için varsayılan mekanizma değildir.

Böylece her iki yöntem de komutların üzerine yazarak ve sarmalayıcıları kullanarak doğru Ruby sürümünü "otomatik olarak" seçer. rvm, cd gibi kabuk komutlarını geçersiz kılar. rbenv, ruby, irb, rake ve gem gibi tüm temel ruby ​​komutlarını geçersiz kılar.


5
rvm system
env > before
rvm jruby # or whatever
env > after
diff after before

Yaklaşık olarak verir:

< GEM_HOME=$HOME/.gem/ruby/1.9.1
---
> GEM_HOME=$HOME/.rvm/gems/jruby-1.6.6
< GEM_PATH=$HOME/.gem/ruby/1.9.1
---
> GEM_PATH=$HOME/.rvm/gems/jruby-1.6.6:$HOME/.rvm/gems/jruby-1.6.6@global
*bunch of rvm_*
> MY_RUBY_HOME=$HOME/.rvm/rubies/jruby-1.6.6
> RUBY_VERSION=jruby-1.6.6
> IRBRC=$HOME/.rvm/rubies/jruby-1.6.6/.irbrc

Ve şöyle devam eder:

$HOME/.rvm/gems/jruby-1.6.6/bin:$HOME/.rvm/gems/jruby-1.6.6@global/bin

için $PATH

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.