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.