2010-12-07 82 views
2

只是有點背景,我來自強大的C#/靜態類型背景。所以我傾向於用.dlls來思考。所以如果我在一個項目中工作,我會參考我所需的dll,那就是這樣。管理Rails的gem版本/依賴關係

是Ruby和Rails的新手我發現我可能做錯了什麼。例如,我使用我在本地創建的寶石在家裏創建了一個Rails應用程序。使用不同的計算機(稱爲工作計算機)我試圖在該項目上工作,只發現我正在使用不同版本的寶石。在執行捆綁安裝後,我回到了一個工作項目。

我與這個問題是,我的寶石庫變得'凌亂'。我結束了幾個版本的相同的寶石。這是其他人的工作方式嗎?當使用寶石(從需求),它會默認爲最新版本?我感覺好像我沒有正確地管理依賴關係,但正如我剛纔提到的,我對Ruby的世界很陌生。

我應該只包括我的依賴項,然後每次有不同的/缺失的依賴項時執行一個bundle安裝?如果我想升級到更新版本的gem,會發生什麼?是否會更新bundle使用並繼續使用的gemfile?

回答

8

是的,bundler是與Ruby on Rails合作的依靠。爲什麼?首先,因爲它隨附它(至少3.0版本)。其次,因爲它很簡單(與Java的Maven不同)。

功能的非詳盡列表:

  • 它可以讓你聲明一個或多個寶石庫從
  • ,以便將依賴由環境獲取寶石(開發,生產...)
  • 指定你想要的版本

等等。欲瞭解更多信息,請查詢http://gembundler.com/rationale.html

關於你的問題:是的,捆綁器將採取最新版本可用沒有被指定。

此外,我會添加一個缺點:你不能指定一個寶石版本取決於操作系統。例如,nokogiri有一個Linux版本和一個勝利版本。

+0

不錯的一個。我不知道你可以省略包文件中的版本。解決了版本差異0.0.1的構建中斷問題 – Finglas 2010-12-07 18:35:35

1

需要gem中的模塊時的默認行爲是假設您希望最新版本的gem(如果您安裝了多個gem)。之前你需要從寶石什麼

gem "rails", "2.3.8" 

:您可以在這樣一個特定的應用程序通過specifying which version you想改變這一點。這可確保此應用程序將使用指定版本的gem,即使安裝了新版本。

當然,如果您不再需要它們,或者如果您始終使用捆綁器,那麼您當然可以清除已安裝的寶石的過時版本:只需擦除所有內容並再次運行捆綁器即可獲取所需的安裝寶石。

另一個有用的工具是Ruby Version Manager(RVM),除了處理不同版本的ruby之外,它還提供了一個名爲gemsets的功能,它允許你隔開不同的應用程序或環境。這就是應用程序A可以擁有其所有必需寶石的單獨gemset,而應用程序B擁有僅具有其所需寶石的另一個gemset。這將相當多地減少你的依賴關係中的混亂。