我应该在我的Gemfile中指定确切的版本吗?

我注意到在rubygems.org上有很多gembuild议你用主版本而不是确切版本来指定它们。 例如…

haml-rails gem …

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

不过,根据Bundler文档 ,我觉得最好能find像这样的确切版本。

 gem "haml-rails", "0.3.4" 

所以你的haml-railsgem,它的所有依赖不会漂移。 如果几个星期后在另一台计算机上签出项目并运行$ bundle install您将拥有与指定的所有内容完全相同的版本。

我已经看到了点发布的东西,我认为Bundler的整个想法的一部分是“ Bundle.lock ”所有的gem版本。

但是在rubygems.org上,他们使用“〜”很多,所以我可能错过了一些东西?

任何澄清将有助于我理解Bundler和gempipe理。

这是Gemfile.lock文件的目的 – 运行带有Gemfile.lock的bundle install ,仅使用其中列出的依赖项进行安装; 它不会重新parsingGemfile。 要更新依赖关系/更新gem版本,您必须明确地执行bundle update ,它将更新您的Gemfile.lock文件。

如果没有Gemfile.lock,将代码部署到生产将是一个主要问题,因为如您所说,依赖和gem版本可能会改变。

简而言之,rubygems.orgbuild议您应该使用悲观版本约束运算符( ~> )来安全使用。 确保在进行bundle update后重新运行testing,以确保没有任何中断。

Yehuda Katz有一篇关于Gemfile.lock的更多信息。

我一定会说使用确切的版本号。 你可能总是把它locking到一个主要的版本,或者从来没有指定任何版本,并没有问题,但是如果你真的想要这个细微程度的控制,并且在其他机器上运行时对你的程序有100%的信心,使用确切的版本号。

我一直在没有指定确切的版本号的情况下,当我或其他人做了一个bundle install ,项目打破了,因为它去了一个新的版本。 部署到生产时可能会特别糟糕。

Bundler 的确locking了你的gem规格,但是如果你告诉它只是使用一个主要的版本,那么它会locking在那里。所以只知道“哦,版本被locking在> 0.1”或任何,但不是“哦版本被locking在0.1.2.3“。