Krótkie wyjaśnienie: rbenv działa poprzez podłączanie się do pliku środowiska PATH
. Koncepcja jest prosta, ale diabeł tkwi w szczegółach; pełna miarka poniżej.
Po pierwsze, rbenv tworzy podkładek dla wszystkich poleceń ( ruby
, irb
, rake
, gem
i tak dalej) we wszystkich zainstalowanych wersji Ruby. Ten proces nazywa się ponownym haszowaniem . Za każdym razem, gdy instalujesz nową wersję Rubiego lub instalujesz klejnot, który udostępnia polecenie, uruchom, rbenv rehash
aby upewnić się, że wszystkie nowe polecenia są podklejone.
Te podkładki znajdują się w jednym katalogu ( ~/.rbenv/shims
domyślnie). Aby użyć rbenv, wystarczy dodać katalog shims na początku PATH
:
export PATH="$HOME/.rbenv/shims:$PATH"
Następnie za każdym razem, gdy uruchamiasz ruby
z wiersza poleceń lub uruchamiasz skrypt, którego shebang czyta #!/usr/bin/env ruby
, twój system operacyjny znajdzie ~/.rbenv/shims/ruby
pierwszy i uruchomi go zamiast dowolnego innego ruby
zainstalowanego pliku wykonywalnego.
Każda podkładka to mały skrypt Bash, który z kolei działa rbenv exec
. Więc z rbenv na twojej ścieżce, irb
jest równoważne rbenv exec irb
i ruby -e "puts 42"
jest równoważne rbenv exec ruby -e "puts 42"
.
Te rbenv exec
dane polecenie, co wersja Ruby, którego chcesz użyć, a następnie uruchamia odpowiednie polecenie dla tej wersji. Oto jak:
- Jeśli
RBENV_VERSION
zmienna środowiskowa jest ustawiona, jej wartość określa wersję Rubiego, której chcesz użyć.
- Jeśli bieżący katalog roboczy zawiera
.rbenv-version
plik, jego zawartość jest używana do ustawiania RBENV_VERSION
zmiennej środowiskowej.
- Jeśli
.rbenv-version
w bieżącym katalogu nie ma pliku, rbenv przeszukuje każdy katalog nadrzędny w poszukiwaniu .rbenv-version
pliku, dopóki nie trafi on do katalogu głównego twojego systemu plików. Jeśli taki zostanie znaleziony, jego zawartość jest używana do ustawienia RBENV_VERSION
zmiennej środowiskowej.
- Jeśli
RBENV_VERSION
nadal nie jest ustawiona, rbenv próbuje ją ustawić używając zawartości ~/.rbenv/version
pliku.
- Jeśli nigdzie nie podano wersji, rbenv zakłada, że chcesz użyć "systemowego" Rubiego - tj. Dowolnej wersji, która byłaby uruchomiona, gdyby rbenv nie był na twojej ścieżce.
(Możesz ustawić wersję Ruby specyficzną dla projektu za pomocą rbenv local
polecenia, które tworzy .rbenv-version
plik w bieżącym katalogu. Podobnie rbenv global
polecenie modyfikuje ~/.rbenv/version
plik.)
Uzbrojony w RBENV_VERSION
zmienną środowiskową, rbenv dodaje ~/.rbenv/versions/$RBENV_VERSION/bin
na początku twojego 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, które uruchomi rbenv, zostanie zapisane na twoim terminalu.
Teraz rbenv zajmuje się tylko przełączaniem wersji, ale dobrze prosperujący ekosystem wtyczek pomoże Ci zrobić wszystko, od instalacji Rubiego po konfigurację środowiska , zarządzanie "gemsetami", a nawet automatyzacjębundle exec
.
Nie jestem do końca pewien, co ma wspólnego obsługa IRC ze zmianą wersji Rubiego, a rbenv został zaprojektowany tak, aby był na tyle prosty i zrozumiały, że nie wymagał wsparcia. Ale jeśli kiedykolwiek będziesz potrzebować pomocy, narzędzie do śledzenia problemów i Twitter to tylko kilka kliknięć.
Ujawnienie: jestem autorem rbenv, ruby-build i rbenv-vars.
Napisałem dogłębny artykuł: http://niczsoft.com/2011/11/what-you-should-know-about-rbenv-and-rvm/
Podstawowa różnica dotyczy miejsca zmiany środowiska powłoki:
Rzecz w tym, że RVM obejmuje znacznie więcej niż tylko zarządzanie Rubinami, ma o wiele więcej niż jakiekolwiek inne narzędzie (oprócz RVM i rbenv istnieją inne: https://twitter.com/#!/mpapis/ status / 171714447910502401 )
Nie zapomnij o natychmiastowym wsparciu, które otrzymujesz na IRC w kanale "#rvm" na serwerach Freenode.
źródło
Podsumowując powyższe doskonałe odpowiedzi, główna praktyczna różnica między RVM a rbenv polega na wybraniu wersji Rubiego.
rbenv:
rbenv dodaje podkładkę na początku ścieżki, polecenie o tej samej nazwie co Ruby. Kiedy
ruby
piszesz w wierszu poleceń, zamiast tego uruchamiana jest podkładka (ponieważ jest również nazywana „ruby” i znajduje się na pierwszym miejscu w ścieżce). Podkładka szuka zmiennej środowiskowej lub.rbenv_version
pliku, aby powiedzieć, do której wersji Rubiego ma być delegowana.RVM:
RVM umożliwia ustawienie wersji Rubiego bezpośrednio przez wywołanie
rvm use
. Ponadto zastępuje równieżcd
polecenie systemowe. Po przejściucd
do folderu zawierającego plik wykonywany jest.rvmrc
kod znajdujący się w.rvmrc
pliku. Można to wykorzystać do ustawienia wersji Rubiego lub czegokolwiek innego, na co masz ochotę.Inne różnice:
Istnieją oczywiście inne różnice. RVM ma klejnoty po wyjęciu z pudełka, podczas gdy rbenv wymaga tylko trochę więcej hakowania (ale niewiele). Oba są funkcjonalnymi rozwiązaniami problemu.
źródło
Wydaje się, że główna różnica polega na tym, kiedy i jak zmienia się rubin . Ruby jest przełączany:
RVM polega na zmodyfikowanym
cd
poleceniu i ręcznym wyborze Rubiego przezrvm use
. rbenv używa wrapperów lub "shims" dla wszystkich podstawowych poleceń ruby jako domyślnego mechanizmu wyboru ruby. RVM tworzy otoki dla podstawowych narzędzi wiersza poleceń, takich jak gem, rake, ruby. Są używane na przykład w CronJobs (patrz http://rvm.io/integration/cron/ ), ale nie są domyślnym mechanizmem przełączania wersji Rubiego.Dlatego obie metody wybierają „automatycznie” właściwą wersję Rubiego, nadpisując polecenia i używając opakowań. rvm zastępuje polecenia powłoki, takie jak cd. rbenv zastępuje wszystkie podstawowe polecenia ruby, takie jak ruby, irb, rake i gem.
źródło
Daje około:
I poprzedza:
do
$PATH
źródło