2012-02-13 70 views
55

我注意到在rubygems.org上有很多寶石建議你用主版本而不是精確版本來指定它們。例如...我應該在我的Gemfile中指定確切的版本嗎?

The haml-rails gem ...

gem "haml-rails", "~> 0.3.4" # "$ bundle install" will acquire the 
           # latest version before 1.0. 

然而,基於它在我聽來就像倒不如敲定這樣的確切版本Bundler docs ...

gem "haml-rails", "0.3.4" 

所以你的haml-rails gem和它的所有依賴不會向前漂移。如果您幾周後在另一臺計算機上籤出項目並運行$ bundle install,則您將擁有與您指定的所有內容完全相同的版本。

我見過的發行點突破的東西,我想捆紮機的整個構思的一部分是「Bundle.lock」所有的寶石版本。

但在rubygems.org他們用「〜>」了很多,所以也許我失去了一些東西?

任何澄清是在理解捆紮機和寶石管理對我很有幫助。

回答

51

這是Gemfile.lock的文件的目的 - 具有Gemfile.lock的本只安裝使用在那裏列出的依賴關係運行bundle install;它不會重新解析Gemfile。要更新依賴項/更新gem版本,您必須明確執行bundle update,它將更新您的Gemfile.lock文件。

如果沒有一個Gemfile.lock的,部署代碼到生產,肯定是因爲一個主要的問題,你提到的依賴和寶石的版本可能會改變。

簡而言之,rubygems.org建議您使用悲觀版本約束運算符(~>),通常應該是安全的。確保在做完bundle update以確保沒有任何中斷後重新運行測試。

有一個nice article由耶胡達·卡茨說,對Gemfile.lock的一些更多的信息。

+0

好的,所以寶石會保留在Gemfile.lock中記錄的已建立版本。那麼添加「〜>」的目的是什麼?那有什麼好處? – Ethan 2012-02-13 19:02:32

+2

@ethan RubyGems的具有[DOC](http://rubygems.rubyforge.org/rubygems-update/Gem/Version.html)說明它(見 「防止版災難」)。它的要點是它只允許版本號中的最後一個整數增加(例如'〜> 1.0.5'允許更新到版本1.0.9999,但從不更新到1.1.x)。該機制允許更新gems,但不會引入可能破壞事物的不兼容性(它假定gem遵循鏈接概要的「Rational Versioning」策略)。 – 2012-02-13 19:29:24

+1

@ethan下面是對RubyDocs網站關於「[悲觀運營商(http://docs.rubygems.org/read/chapter/16#page74)」(〜>)和[理性版本(HTTP一對夫婦更多的鏈接://docs.rubygems.org/read/chapter/7)。 – 2012-02-13 19:40:39

5

我肯定會說使用確切的版本號。你可能總是把它鎖定到一個主要版本,或者從不指定任何版本,並且沒問題,但是如果你真的想要這種細微程度的控制,並且在其他機器上運行時對你的程序有100%的信心,使用確切的版本號。

我一直在沒有指定確切版本號的情況下,以及當我或其他人做了bundle install時,該項目因爲更新的版本而崩潰。部署到生產時這可能特別糟糕。

Bundler 確實鎖定您的寶石規格,但如果您告訴它只是使用主要版本,那麼它會鎖定它。所以只知道「哦,版本被鎖定在> 0.1」或不管怎樣,但不是「哦版本鎖定在0.1.2.3」。

+8

如果存在'Gemfile.lock',Bundler確實知道要安裝哪個特定的版本(這就是爲什麼'Gemfile.lock'應該和'Gemfile'一起存儲在repo中的原因)。 – mipadi 2012-02-13 18:29:18

+1

雖然最終可能會比您想象的更新方式更新,但即使使用Gemfile,也可以執行'更新包''。鎖'存在,這可能是一個危險和粘滯的情況。 – MrDanA 2014-05-07 12:42:18

+0

我同意從RubyGems的自己的建議,在這個問題上:只需使用悲觀約束(〜>)。這鼓勵整個社區加強語義版本控制,這是一件好事,在這個與Gemfile.lock的內置穩定特性之間,你的基礎應該被覆蓋。 – user456584 2014-10-25 23:15:09

相關問題