142

我是 Ruby on Rails 的初学者,我正在使用 Rails 3.0.9。

GemfileRails和Rails有什么区别Gemfile.lock

4

3 回答 3

180

您可以在此处指定要使用的Gemfilegem,并允许您指定哪些版本。

Gemfile.lock文件是 Bundler 记录已安装的确切版本的位置。这样,当在另一台机器上加载相同的库/项目时,运行bundle install将查看Gemfile.lock并安装完全相同的版本,而不仅仅是使用Gemfile并安装最新版本。(在不同的机器上运行不同的版本可能会导致测试中断等)你不应该直接编辑锁定文件。

查看Bundler 的目的和基本原理,特别是 Checking Your Code into Version Control 部分。

于 2011-08-03T13:52:13.200 回答
169

通常我们在 Gemfile 中写依赖为:

gem "nokogiri", "~> 1.4.4"
gem 'bcrypt-ruby', '~> 3.0.0'
gem 'uglifier', '>= 1.2.3'
..

在这里,您基本上会说:“我想要 nokogiri,只要它大于 1.4.4 版本”等等。现在假设我已经在Gemfile 8 个月前设置了我的应用程序,并且我成功地根据这个要求设置了我的应用程序。8 个月前 nokogiri 版本是1.4.4。我的 Rails 应用程序运行完美,这个版本没有任何问题。

现在想我正在尝试使用相同的Gemfile. 但是,如果我们查看nokogiri 版本,我们会发现当前的稳定版本已更改为1.4.9。这意味着如果我们尝试构建,bundler 将安装nokogiri 的1.4.9版本(假设我们没有Gemfile.lock)。

这是什么意思 ?

如您所见,如果没有Gemfile.lock并运行:

bundle install

那么当前使用的宝石可以随时不同。您的应用使用了1.4.4版本,并且在8 个月前可以正常运行,但如果您现在尝试构建它,您将获得1.4.9版本。也许它被最新版本破坏了,你在1.4.4nokogiri中使用的很棒的功能不再可用,等等。

为了防止这种问题Gemfile.lock被使用。仅编写Gemfile.lock确切的版本,因此只会安装这些版本。这意味着如果您使用 . 分发您的应用程序Gemfile.lock,每台机器都将安装相同的 gem,最重要的是它们都将获得相同的版本。这将为您提供稳定且通用的部署堆栈。

Gemfile.lock 是如何创建的?

它是使用第一个自动创建的:

bundle install

命令。之后每次运行bundle install时,bundle 都会首先查找Gemfile.lock并安装那里指定的 gem。在您的项目中分发此文件以提供一致和稳定性是一种习惯。

如何更新 Gemfile.lock?

如果您对应用程序的最新版本感到满意,则可以进行更新Gemfile.lock。只需将您的更改反映到Gemfile. 这意味着将依赖项更改为Gemfile. 之后运行:

bundle install

这将为您更新Gemfile.lock最新版本的应用程序。

于 2012-06-09T09:13:49.570 回答
6

Gemfile.lock

当您运行 bundle install 时,Bundler 会将您使用的所有 gem 的全名和版本(包括 Gemfile(5) 中指定的 gem 的依赖项)保存到一个名为 Gemfile.lock 的文件中。

Bundler 在对 bundle install 的所有后续调用中都使用此文件,这可以保证您始终使用完全相同的代码,即使您的应用程序跨机器移动也是如此。

由于依赖解析的工作方式,即使是看似很小的更改(例如,更新 Gemfile(5) 中 gem 的依赖的点发布)都可能导致需要完全不同的 gem 来满足所有依赖。

因此,您应该检查您的 Gemfile.lock 到版本控制。如果您不这样做,每台检出您的存储库(包括您的生产服务器)的机器将再次解析所有依赖项,这将导致使用不同版本的第三方代码,如果 Gemfile(5) 中的任何 gem 或任何它们的依赖项已更新。

于 2013-11-07T12:06:35.133 回答