2011-12-19 8 views
21

Dzieje się tak dlatego, że katalog instalacyjny Gem używany przez komendę gem, gdy wykorzystywane gem env, jest ustawiony na coś takiego:Dlaczego instalujemy klejnoty Ruby 1.9.2/1.9.3 w folderze 1.9.1?

<base_ruby_dir>/lib/ruby/gems/1.9.1 

Moje pytanie brzmi: dlaczego?

nie powinien być folder o nazwie:

<base_ruby_dir>/lib/ruby/gems/1.9.x 

lub

<base_ruby_dir>/lib/ruby/gems/1.9 

albo nie mógł tam być jeden za wersją Ruby, jak:

c:/ruby191/lib/ruby/gems/1.9.1 
c:/ruby192/lib/ruby/gems/1.9.2 
c:/ruby193/lib/ruby/gems/1.9.3 

Nie krytyczny problem, który znam, po prostu się zastanawiałem.

Odpowiedz

28

W Ruby 1.9.0 interfejs C został zmieniony z serii Ruby 1.8.

Kamienie kompilujące się do natywnego kodu musiały zostać ponownie skompilowane.

Interfejs został ponownie zmieniony w Ruby 1.9.1 i zachowany w Ruby 1.9.2 & 3. To wyjaśnia 1.9.1, który widzisz na swojej ścieżce.

Chodzi o to, że możesz zainstalować różne wersje Ruby w swoim systemie i że klejnoty będą udostępniane w grupach mających to samo C api. Tak więc Ruby 1.8.6 i 1.8.7 mogą udostępniać swoje klejnoty, podobnie jak Ruby 1.9.1, .2 i .3.

To niekoniecznie najlepszy pomysł. W każdym razie, większość ludzi używa rvm, aby uzyskać dostęp do różnych wersji Rubiego i rvm utrzymuje oddzielne kamienie dla każdej wersji, niezależnie od wersji C api.

+0

Ok, rozumiem. Więc 1.9.1 oznacza, że ​​klejnot jest zgodny z interfejsem C używanym w Rubim 1.9.1? Ten rodzaj ujawnia szczegóły wdrożenia, prawda? Z punktu widzenia użytkownika końcowego, dlaczego mnie to obchodzi? Czy kiedykolwiek zobaczę dwa foldery obok siebie, takie jak 1.9.1 i 1.9.4? Jeśli nie, to dlaczego mnie to obchodzi? – Ben

+0

W prawo. C Api * zdecydowanie * ujawnia szczegóły implementacji! Użytkownicy Gem nie powinni dbać o ścieżkę. Odpowiedź edytowana na dwa ostatnie pytania –

+0

Dla mnie pytanie dotyczy konwencji nazewnictwa katalogów. Jeśli wiemy, że zmiana w API C Rubiego spowoduje przekompilowanie wszystkich klejnotów przy użyciu tej wersji Ruby, to albo mam folder o nazwie 1.9.1 z klejnotami w, * lub * folder o nazwie 1.9.2 (lub cokolwiek). Jeśli nie mogę mieć obu (dla jednej wersji Rubiego), wówczas 1.9.x będzie bardziej sensowne.Nigdy nie widziałem tego samego folderu, który był używany do przechowywania klejnotów dla wielu wersji Ruby - czy jest to faktycznie przypadek użycia? – Ben

0

Myślę, że to dlatego, że te wersje powinny być kompatybilne, a gdybyś miał osobne katalogi, musiałbyś ponownie zainstalować wszystkie swoje klejnoty. W ten sposób możesz uaktualnić wersję ruby ​​bez ponownej instalacji wszystkich klejnotów.

+1

Hmm tak, to ma sens. Ale w takim razie dlaczego nie zadzwonić do folderu 1.9 lub 1.9.x? Wydaje mi się dziwne. – Ben

+0

To samo dotyczy pakietów Ruby Debiana. Zainstalowałem 1.9.2 z pakietu o nazwie ruby1.9.1. Nazwa pliku wykonywalnego również została nazwana. – Linuxios

+0

Nie ma gwarancji (niestety), że ABI pozostanie niezmieniona przez cały cykl życia 1.9.x. Jeśli 1.9.4 nagle używa ABI, która łamie kompatybilność z 1.9.1-1.9.3, to twoja ścieżka 1.9.x zostaje nagle nazwana niepoprawnie. – jgoldschrafe

Powiązane problemy