Instalowanie najnowszej wersji Ruby na Snow Leopard

4

Pobrałem i skompilowałem najnowszą wersję Ruby 1.9.2, która została zainstalowana /usr/local/bin/ruby, jednak system oficjalnie rozpoznaje wersję /usr/bin/ruby1.8.7, która została zainstalowana na komputerze. Jak mogę umieścić nowy rubin na swoim miejscu?

W tym przypadku muszę zastąpić wersję Ruby i móc używać zaktualizowanej wersji do pracy z wierszem poleceń i rozwoju szyn.

Jason Yost
źródło
2
Możesz zajrzeć do RVM - Ruby Version Manager - pozwala na zainstalowanie wielu wersji Ruby wraz z określonymi zestawami gemów dla różnych projektów. rvm.beginrescueend.com
barryj
1
Czy naprawdę potrzebujesz zastąpić / usr / bin / ruby, czy jesteś otwarty na alternatywy takie jak RVM lub modyfikację zmiennej $ PATH?
bmike
Tak, muszę wymienić wersję Ruby, która jest obecnie zainstalowana w systemie. To wydaje się trudne do zrobienia na podstawie odpowiedzi, które otrzymuję.
Jason Yost
Chcę mieć pewność, że rozumiesz, co mówisz. „Zamień” Ruby bardzo różni się od „użyj innej wersji” Ruby. Jeśli chcesz tego drugiego, RVM byłoby świetną opcją, jak już wspomniało kilka osób. Jeśli jesteś pewien, że chcesz zastąpić systemową wersję Ruby (i rozumiesz, że może to mieć negatywne konsekwencje), wyjaśnię, jak to zrobić u dołu mojej odpowiedzi poniżej. Tak czy inaczej, powinno być tutaj mnóstwo informacji, aby odpowiedzieć na twoje pytanie.
Austin
Wygląda na to, że RVM jest lepszym rozwiązaniem niż zastępowanie systemowej wersji ruby. Dziękujemy wszystkim za Twój wkład.
Jason Yost

Odpowiedzi:

9

Powinieneś użyć RVM , Ruby Version Manager. Pozwala na wiele równoległych instalacji Ruby bez wpływu na systemową instalację Ruby, co, jak zauważył inny komentator, może być potencjalnie problematyczne (lub przynajmniej męczące w utrzymaniu).

Pozwala szybko i łatwo zainstalować najnowszą łatkę Ruby, wcześniejsze wersje Ruby, a nawet alternatywne implementacje, takie jak JRuby, MacRuby lub Rubinius.

Żeby zainstalować:

$ bash < <(curl -s https://rvm.beginrescueend.com/install/rvm)

Po zainstalowaniu ustawienie 1.9.2 jako domyślne jest tak proste, jak pisanie:

rvm default 1.9.2

A jeśli chcesz tymczasowo wrócić do wersji 1.8.7:

rvm use 1.8.7
michaelmichael
źródło
+1 Używanie RVM do zarządzania moimi instalacjami Ruby i zestawami klejnotów zmieniło moje życie. Za każdym razem, gdy pojawia się niezgodność lub konflikt, wracam do działania w ciągu kilku minut.
ghoppe
Chociaż uwielbiam RVM - to nie odpowiada na postawione pytanie. OP ma już rubin, który chce skompilować i wydaje się, że nie zamierza używać $ PATH, aby pozwolić im współistnieć.
bmike
1
@bike Gdzie głos OP jest taki? Nie widzę tego Nie zgadzam się z twoją interpretacją tego, co to znaczy odpowiedzieć na pytanie na StackExchange. Udzielanie porad, przedstawianie alternatyw i opisywanie najlepszych praktyk są również ważnymi odpowiedziami, jeśli odpowiadają potrzebom pytającego, którym w tym przypadku jest zainstalowanie najnowszej wersji Ruby na Snow Leopard.
michaelmichael
Zgadzam się, że RVM jest najlepszym sposobem na utrzymanie niestandardowego rubinu. Ale chyba, że ​​pytanie zostanie zredagowane (co, mam nadzieję, stanie się bardziej przydatne, aby pasowało do twojej wspaniałej odpowiedzi), nie widzę, jak „użyj RVM” najlepiej odpowiada na pytanie „jak wymienić / usr / bin / ruby ​​na 1.8. 7 z / usr / local / bin / ruby ​​w wersji 1.9.2? " Co jeśli OP ma skrypty zakodowane na stałe do wywołania / usr / bin / ruby? Czy RVM wkracza tam, aby pomóc?
bmike
2

Co rozumiesz przez „wprowadzenie nowego Ruby na miejsce”?

Jeśli próbujesz uruchomić go z wiersza poleceń, używając tylko polecenia ruby, system będzie przeszukiwał każdą ze ścieżek określonych /etc/pathsw kolejności, aż znajdzie pasujące. W systemie Snow Leopard domyślny /etc/pathsplik wygląda następująco:

/usr/bin
/bin
/usr/sbin
/sbin
/usr/local/bin

Więc kiedy wejdziesz rubyw linię poleceń, system szuka /usr/bin/rubynajpierw, znajduje ją i nie sprawdza reszty ścieżek (więc nigdy się nie dostanie /usr/local/bin/ruby). Aby to potwierdzić, możesz wpisać which rubyw wierszu polecenia, a system wydrukuje ścieżkę do pliku wykonywalnego, którego użyłby dla tego polecenia.

Jeśli chcesz uruchomić nowszą wersję Ruby z wiersza poleceń, po prostu wpisz /usr/local/bin/rubyzamiast ruby.

Jeśli używasz innego programu, który używa Ruby pośrednio, prawdopodobnie istnieje gdzieś opcja, aby określić ścieżkę do ruby.


EDYCJA: W ostateczności możesz zastąpić wbudowaną wersję systemową Ruby nowszą wersją. Użyj następujących poleceń i po wyświetleniu monitu wprowadź hasło administratora:

cp /usr/bin/ruby ~/Desktop/ruby_OLD
sudo cp /usr/local/bin/ruby /usr/bin/ruby

Jeśli coś się psuje, odłóż to z powrotem za pomocą tego polecenia:

sudo mv ~/Desktop/ruby_OLD /usr/bin/ruby

Jednak, jak wspomnieli inni, użycie narzędzia takiego jak RVM do zarządzania Ruby byłoby lepszym pomysłem niż uaktualnienie wbudowanej instalacji.

Austin
źródło
2
Nadpisywanie komponentów systemu jest zwykle złym pomysłem. Mogą istnieć inne aplikacje w zależności od /usr/bin/rubytego, czy dostarczono je Apple ruby.
@Bararious Myślę, że szanse na to są bardzo małe rubyw OS X (byłoby inaczej, gdybyśmy mówili o wprowadzeniu poważnej zmiany, takiej jak PHP4 na PHP5). Ale masz rację, że generalnie jest to zły pomysł, dlatego wspomniałem o tym ostatnio. Przypuszczam, że istnieje powód, dla którego ten użytkownik woli wersję 1.9.2 niż 1.8.7 lub nie zadawałby tego pytania - potencjalne korzyści płynące z uruchomienia najnowszej wersji prawdopodobnie przewyższają niewielkie ryzyko uszkodzenia czegoś, ponieważ został zaktualizowany do następnej drobnej wersja.
Austin,
czy jesteś pewien, że ryzyko jest „małe”? Zarządzanie Ruby za pomocą RVM jest o wiele łatwiejsze i bezpieczniejsze.
ghoppe
@ghoppe Mówię, że ryzyko jest „małe”, ponieważ prawdopodobnie nie zepsujesz żadnej ważnej, podstawowej funkcji systemu w OS X poprzez aktualizację Ruby. Czy może to powodować dziwactwo w małym zakątku systemu, gdzie trudno jest rozwiązać problem? Może. Ostatecznie główny ból głowy prawdopodobnie będzie związany z konserwacją, jeśli planuje on często aktualizować Ruby. Zdecydowanie masz rację, że RVM byłby dobrą opcją i znacznie lepiej niż zmienianie plików systemowych.
Austin,
2

Jeśli naprawdę chcesz zastąpić istniejący /usr/bin/ruby(który jest po prostu linkiem sym /System/Library/Frameworks/Ruby.framework/Versions/Current/usr/bin/ruby), po prostu zastąp istniejący plik tym, który skompilowałeś, starając się dopasować uprawnienia do pliku.

Powodów tego nie ma wiele, ale jest to takie proste, biorąc pod uwagę dosłowną interpretację twojego pytania.

Większość ludzi zmienia swoją ścieżkę, aby uwzględnić nowszy rubin przed wersją systemową, ponieważ jest to prostsze i mniej prawdopodobne, że zepsuje inne rzeczy, które zależą od zainstalowanej wersji ruby ​​i powiązanego z nią dylib, klejnotów, rdoców i tym podobnych.

Jedną z korzyści płynących z homebrew i Fink i RVM i DarwinPorts jest to, że pomaga zautomatyzować inscenizację do innej lokalizacji i wspierać modyfikując swoją ścieżkę.

Możesz zrobić to samo z rubinem, który posiadasz /usr/local/bin, manipulując zmienną ścieżki i następnie which -a rubydwukrotnie sprawdzając swoją pracę.

bmike
źródło
2

Sposobem na znalezienie dowolnego samodzielnie zainstalowanego programu, zanim zostanie dostarczony Apple, jest dodanie katalogu nowego programu (np. / Usr / local / bin) do fromt zmiennej środowiskowej PATH.

Jeśli używasz ruby ​​z powłoki edytuj ~ / .profile lub jeśli z GUI ~ / .MacOSX / environment.plist

znak
źródło
To jest lepsze IMHO niż zastępowanie plików binarnych, jak prosi OP.
bmike
0

Możesz rzucić okiem na Homebrew , która ułatwia instalację najnowszego Rubiego - brew install rubyto wszystko czego potrzebujesz - i wiele innych pakietów bez ingerowania w nic już w twoim systemie, do lokalizacji (prawie na pewno) już w twoim $PATH.

Jedna rzecz dobrze
źródło