Jak działają RVM i rbenv?

Interesuje mnie jak RVM i rbenv faktycznie działają.

Oczywiście zamieniają się między różnymi wersjami Ruby i gemsets, ale jak to osiągnąć? Założyłem, że po prostu aktualizują dowiązania symboliczne, ale zagłębiając się w kod (i muszę przyznać, że moja wiedza o Bash jest powierzchowna) wydają się robić więcej niż to.

Author: the Tin Man, 2012-02-22

5 answers

Krótkie wyjaśnienie: rbenv działa poprzez podłączenie do Twojego środowiska PATH. Koncepcja jest prosta, ale diabeł tkwi w szczegółach; Pełna treść poniżej.

Najpierw rbenv tworzyshims dla wszystkich poleceń (ruby, irb, rake, gem i tak dalej) we wszystkich zainstalowanych wersjach Rubiego. Proces ten nazywa się rehashing. Za każdym razem, gdy instalujesz nową wersję Ruby lub gem, który zawiera polecenie, Uruchom rbenv rehash, aby upewnić się, że wszystkie nowe polecenia są / align = "left" /

Te shimy żyją w jednym katalogu (~/.rbenv/shims domyślnie). Aby korzystać z rbenv, wystarczy dodać katalog shims z przodu PATH:

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

Następnie za każdym razem, gdy uruchomisz ruby z linii poleceń lub uruchomisz skrypt, który odczytuje #!/usr/bin/env ruby, Twój system operacyjny znajdzie ~/.rbenv/shims/ruby i uruchomi go zamiast dowolnego innego ruby wykonywalnego, który możesz zainstalować.

Każdy shim jest małym skryptem Basha, który z kolei działa rbenv exec. Więc z rbenv na swojej drodze, irb jest równoważne rbenv exec irb, a {[16] } jest równoważne rbenv exec ruby -e "puts 42".

Polecenie rbenv exec określa, jakiej wersji Rubiego chcesz użyć, a następnie uruchamia odpowiednie polecenie dla tej wersji. Oto Jak:

  1. jeśli zmienna środowiskowa RBENV_VERSION jest ustawiona, jej wartość określa wersję Ruby do użycia.
  2. Jeśli bieżący katalog roboczy zawiera plik .rbenv-version, jego zawartość jest używana do ustawienia zmiennej środowiskowej RBENV_VERSION.
  3. jeśli nie ma .rbenv-version pliku w bieżący katalog, rbenv przeszukuje każdy Katalog nadrzędny w poszukiwaniu pliku .rbenv-version, aż trafi do katalogu głównego Twojego systemu plików. Jeśli taka zostanie znaleziona, jej zawartość zostanie użyta do ustawienia zmiennej środowiskowej RBENV_VERSION.
  4. jeśli {[19] } nadal nie jest ustawione, rbenv próbuje ustawić go używając zawartości pliku ~/.rbenv/version.
  5. jeśli nigdzie nie podano żadnej wersji, rbenv zakłada, że chcesz użyć" systemowego " Rubiego-tzn. niezależnie od wersji, która byłaby uruchomiona, gdyby rbenv nie było na twojej ścieżce.

(możesz ustawić specyficzna dla projektu wersja Ruby z poleceniem rbenv local, które tworzy plik .rbenv-version w bieżącym katalogu. Podobnie, polecenie rbenv global modyfikuje plik ~/.rbenv/version.)

Uzbrojony w zmienną środowiskową RBENV_VERSION, rbenv dodaje ~/.rbenv/versions/$RBENV_VERSION/bin do przedniej części PATH, a następnie wykonuje polecenie i argumenty przekazane do rbenv exec. Voila!

Aby dokładnie przyjrzeć się temu, co dzieje się pod maską, spróbuj ustawić RBENV_DEBUG=1 i uruchomić polecenie Ruby. Każde polecenie Bash uruchamiane przez rbenv będzie / align = "left" /


Teraz rbenv zajmuje się tylko przełączaniem wersji, ale kwitnący ekosystem wtyczek pomoże Ci zrobić wszystko, od instalacji Ruby do konfiguracji Twojego środowiska, zarządzanie "gemsetami" , a nawet automatyzowanie bundle exec.

Nie jestem do końca pewien, co Obsługa IRC ma wspólnego ze zmianą wersji Rubiego, a rbenv jest zaprojektowany tak, aby był wystarczająco prosty i zrozumiały, aby nie wymagał wsparcia. Ale powinien jeśli kiedykolwiek potrzebujesz pomocy, narzędzie do śledzenia problemów i Twitter znajdują się zaledwie kilka kliknięć.

ujawnienie: jestem autorem rbenv, ruby-build i rbenv-vars.

 233
Author: Sam Stephenson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-23 23:27:33

Napisałem obszerny artykuł: http://niczsoft.com/2011/11/what-you-should-know-about-rbenv-and-rvm/

Podstawowa różnica polega na zmianie środowiska powłoki:

  • RVM: zmieniło się, gdy zmieniasz Ruby.
  • rbenv: zmienia się po uruchomieniu pliku wykonywalnego Ruby / gem.

Ponadto, rzecz o RVM jest, Obejmuje o wiele więcej niż tylko zarządzanie rubinami, ma o wiele więcej niż jakiekolwiek inne narzędzie (istnieją inne oprócz RVM i rbenv: https://twitter.com/#!/mpapis / status/171714447910502401)

Nie zapomnij o natychmiastowym wsparciu otrzymanym na IRC w kanale "#rvm " na serwerach Freenode.

 18
Author: mpapis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-18 16:36:47

Podsumowując powyższe doskonałe odpowiedzi, główną praktyczną różnicą między RVM a Rbenv jest wybór wersji Ruby.

Rbenv:

Rbenv dodaje shim na początku ścieżki, polecenie o tej samej nazwie co Ruby. Kiedy wpisujesz ruby w wierszu poleceń, shim jest uruchamiany (ponieważ jest również nazywany "ruby" i jest pierwszy w ścieżce). Shim szuka zmiennej środowiskowej lub pliku .rbenv_version, aby powiedzieć, którą wersję Ruby delegować za.

RVM:

RVM pozwala ustawić wersję Rubiego bezpośrednio przez wywołanie rvm use. Ponadto nadpisuje polecenie systemowe cd. Gdy cd znajdziesz się w folderze zawierającym plik .rvmrc, wykonywany jest kod wewnątrz pliku .rvmrc. To może być użyte do Ustawienia wersji Ruby lub czegokolwiek innego, co ci się podoba.

Inne różnice:

Są oczywiście inne różnice. RVM ma gemsets po wyjęciu z pudełka, podczas gdy rbenv wymaga tylko trochę więcej hackingu (ale niewiele). Oba są funkcjonalnymi rozwiązaniami problemu.

 14
Author: superluminary,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-24 06:38:48
rvm system
env > before
rvm jruby # or whatever
env > after
diff after before

Daje w przybliżeniu:

< 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

I poprzedza:

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

Do $PATH

 5
Author: Reactormonk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-18 16:37:14

Główna różnica wydaje się być Kiedy i jak ruby jest przełączany. Ruby jest przełączany:

  • dla RVM ręcznie (RVM use) lub automatycznie podczas zmiany katalogów
  • dla rbenv automatycznie za każdym razem, gdy wykonywane jest polecenie ruby

RVM opiera się na zmodyfikowanym poleceniu cd i ręcznym wyborze Rubiego przez rvm use. rbenv używa wrapperów lub "shims" dla wszystkich podstawowych poleceń Rubiego jako domyślnego mechanizmu wyboru Rubiego. RVM tworzy wrappery dla Komendy basic narzędzia liniowe, takie jak gem, rake, ruby, too. Są one używane na przykład w CronJobs ( zobacz http://rvm.io/integration/cron/), ale nie są domyślnym mechanizmem przełączania wersji Ruby.

W ten sposób obie metody wybierają" automatycznie " właściwą wersję Ruby przez nadpisanie poleceń i użycie wrapperów. RVM nadpisuje polecenia powłoki, takie jak cd. rbenv nadpisuje wszystkie podstawowe polecenia Rubiego, takie jak ruby, irb, rake i gem.

 5
Author: 0x4a6f4672,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-20 14:53:56