2011-05-20 18 views
3

有什麼好處&將東西安裝到RVM中@global gemset的缺點?


假設我想在同一臺服務器上安裝不同版本的rails。然後我希望能夠在同一臺服務器上安裝多個ruby應用程序,並將最少重複的文件保存在磁盤空間上。但是,我仍然想避免依賴性問題,寶石衝突問題和其他問題。將東西安裝到RVM中的@global gemset中有什麼好處和缺點?

我們還假設每個應用程序都有額外的寶石,我只需要它的本地項目gemset。

我會變得更好:

  1. 安裝兩種Rails 3根的梁2個寶石到@global寶石
    • ...而對於他們的寶石使用的項目本地gemsets。 ..
  2. 安裝Rails 3轉換爲@rails3 gemset,並將Rails 2轉換成@rails2集...然後克隆我需要的每個項目?
    例如:
    • rvm use [email protected] && rvm gemset export rails3.gems
    • rvm use [email protected] && rvm gemset export rails2.gems
    • rvm use --create [email protected] && rvm gemset import rails3.gems
      • 安裝在這裏更多的項目,當地的寶石...
    • rvm use --create [email protected] && rvm gemset import rails2.gems
      • 安裝在這裏更多的項目,當地的寶石...
  3. 完全是另一回事...

回答

3

注:我寫了這整個響應假設你正在使用捆紮機管理你的寶石依賴。我意識到有些人沒有,你沒有提到Bundler的問題。如果你不使用Bundler,我會指出它可能是節省磁盤空間的最佳方式(只有當你使用bundle install --system時!)。如果您使用導出的gemset來管理依賴關係,我認爲您的方案聽起來合理,但我沒有經驗。


兩個軌3,和軌道2與捆紮機將設置它們的負載路徑適當地,使得它們將不會加載不在Gemfile.lock任何寶石(或任何寶石的任何版本)。在服務器上沒有任何方法可以解決「gem依賴性問題」。每當您修改Gemfile時,在您的開發計算機上運行bundle install非常重要,並且您將Gemfile.lock檢入源控件,如Bundler homepage中所述。

我花了一些時間深入瞭解返回in January的gemsets用例。我發現使用單獨的gemsets每個項目的理由是:

  1. 你的shell環境是一樣的你的應用環境(腳本正確運行,而不bundle exec)。
  2. 通過導航到gemset安裝目錄,您可以輕鬆瀏覽和grep所有依賴項的源代碼。據RVM的作者說,它可以防止一些報道的「heisenbugs」。我經歷過類似這樣的事情,其中​​一個寶石可執行文件不可用,bundle exec似乎沒有幫助。

我不認爲這些好處在服務器上非常有吸引力,所以如果您打算節省磁盤空間,我不確定爲什麼您會使用gemsets。

實際上,我在服務器上使用rvm的唯一原因是因爲它是從源代碼構建ruby(我們需要的版本在本機軟件包管理器中不可用)的一種便捷方式。

+0

在我的服務器環境中使用RVM的主要原因是能夠在可能不同版本的Ruby上託管多個應用程序(如果需要,甚至可以下載到修補程序級別)。服務器需要足夠的靈活性來承載N個任意應用程序,而不管他們是否使用Bundler,或者需要特定的環境來運行。把它看作是一個託管提供者環境,而不是一個開發服務器環境。 由於備份的大小,磁盤空間受到關注。 – TrinitronX 2011-05-20 15:47:48

+0

我無法評論使用RVM運行共享主機環境的有效性。 – 2011-05-20 15:55:42