Gemfile 和 Gemfile.lock 在 Ruby on Rails 中的区别是什么

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

在 Rails 中 GemfileGemfile.lock有什么不同?

66808 次浏览

Gemfile是您指定要使用哪些 gems 的地方,并允许您指定哪些版本。

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

查看 Bundler 的目的和基本原理,特别是将代码签入版本控制部分。

在 Gemfile,我们通常把附属关系写成:

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

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

现在我想用同样的 Gemfile来构建。但是如果我们看看 Nokogiri 版本,我们会发现当前的稳定版本已经变成了 1.4.9。这意味着如果我们尝试构建,bundler 将安装 nokogiri 的 1.4.9版本(假设我们没有 Gemfile.lock)。

这是什么意思?

正如你看到的,如果你没有任何 Gemfile.lock和运行:

bundle install

然后是 目前使用的宝石可以在任何时候不同。你的应用程序使用的版本 1.4和它的工作 八个月前没有任何问题,但如果你试图建立它 现在你得到的版本 1.4.9。也许是最新版本的 nokogiri出了问题,你在 1.4中使用的那个令人敬畏的特性没有更多的可用性,等等。.

为了防止这种问题,使用了 Gemfile.lock。在 Gemfile.lock中只有 完全相同的版本被写入,因此只有这些将被安装。这意味着,如果你发布的应用程序与 Gemfile.lock,每台机器将有相同的宝石安装和最重要的 他们得到的版本都一样。这将为您提供一个稳定的、通用的部署堆栈。

如何创建 Gemfile.lock?

它自动创建与第一个:

bundle install

指挥官。在此之后,每次运行 bundle install时,bundle 将首先查找 Gemfile.lock并安装在其中指定的 gem。在项目中分发该文件以提供一致性和稳定性是一种习惯。

如何更新 Gemfile.lock?

如果你对你的应用程序的最新版本感到满意,你可以更新 Gemfile.lock。只要反映您的变化,以 Gemfile。这意味着将依赖项更改为 Gemfile中新的确切版本。在那之后:

bundle install

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

双子档案,锁

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

Bundler 在所有后续调用中使用此文件进行捆绑安装,这保证您始终使用相同的代码,即使您的应用程序在计算机之间移动。

由于依赖解析的工作方式,即使是一个看起来很小的改变(例如,对 Gemfile (5)中一个 gem 依赖的一个点释放的更新)也可能导致需要完全不同的 gem 来满足所有的依赖。

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