2011-12-19 64 views
21

這都有關,因爲由gem命令使用的寶石安裝目錄,看到了使用gem env時,被設置爲一樣的東西:爲什麼我們將Ruby 1.9.2/1.9.3 gem安裝到1.9.1文件夾中?

<base_ruby_dir>/lib/ruby/gems/1.9.1 

我的問題是爲什麼呢?

不應在文件夾被稱爲:

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

<base_ruby_dir>/lib/ruby/gems/1.9 

否則不可能有每紅寶石的一個版本,如:

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

不我知道的一個關鍵問題,我只是想知道。

回答

28

在Ruby 1.9.0中,C接口從Ruby 1.8系列改爲了。

編譯爲本地代碼的Gem必須重新編譯。

界面在Ruby 1.9.1中再次更改,並保持在Ruby 1.9.2中相同& 3.這解釋了您在路徑中看到的1.9.1。

這個想法是,您可以在您的系統上安裝不同版本的Ruby,並且將在具有相同C api的組內共享寶石。所以Ruby 1.8.6和1.8.7可以分享他們的寶石,Ruby 1.9.1,.2和.3也是如此。

雖然這不一定是最好的主意。在任何情況下,大多數人使用rvm來訪問不同版本的Ruby,並且rvm保持每個版本的gem獨立,而不考慮C api版本。

+0

好的,我明白了。那麼1.9.1是否意味着gem符合Ruby 1.9.1中使用的C接口?這種暴露實施細節不是嗎?從一個寶石的最終用戶的角度來看,我爲什麼要關心?我會不會像1.9.1和1.9.4一樣看到兩個文件夾?如果不是,我又爲何要關心? – Ben 2011-12-19 23:35:41

+0

對。 C Api *絕對*暴露實現細節!寶石用戶不應該關心路徑。回答爲最後兩個問題編輯 – 2011-12-20 01:26:23

+0

對我來說,問題是關於目錄命名約定。如果我們知道對Ruby的C API的更改會導致使用該版本的Ruby重新編譯所有gem,那麼我將得到一個名爲1.9.1的文件夾,其中包含*或*的文件夾,名稱爲1.9.2(管他呢)。如果我不能同時擁有(對於Ruby的一個版本),那麼1.9.x會更明智。我從來沒有見過用於存儲多個Ruby版本的寶石的相同文件夾 - 這實際上是一個真正的用例嗎? – Ben 2011-12-20 09:18:07

0

我認爲這是因爲這些版本應該兼容,如果你有單獨的目錄,你必須重新安裝所有的寶石。這樣你就可以升級紅寶石的版本而不必重新安裝所有的寶石。

+1

嗯,是的,這是有道理的。但在那種情況下,爲什麼不叫1.9或1.9.x文件夾呢?對我來說似乎很奇怪。 – Ben 2011-12-19 16:48:26

+0

它與Ruby Debian軟件包相同。我從一個名爲ruby1.9.1的軟件包安裝了1.9.2。可執行文件也被命名。 – Linuxios 2011-12-19 16:57:51

+0

不幸的是(不幸的是)ABI在整個1.9.x生命週期中保持不變。如果1.9.4突然使用與1.9.1-1.9.3兼容的ABI,那麼您的1.9.x路徑突然命名不正確。 – jgoldschrafe 2012-09-11 04:26:28

相關問題