Ruby on Rails中的Gemfile和Gemfile.lock有什么区别?

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

Rails中GemfileGemfile.lock什么区别?

Gemfile是您指定要使用的gem的地方,并且可以指定哪些版本。

Gemfile.lock文件是Bundlerlogging安装的确切版本的位置。 这样,当在另一台机器上加载相同的库/项目时,运行bundle install将查看Gemfile.lock并安装完全相同的版本,而不仅仅是使用Gemfile并安装最新版本。 (在不同的机器上运行不同的版本可能会导致testing失败等)您不应该直接编辑locking文件。

检查Bundler的目的和理由 ,特别是检查您的代码到版本控制部分。

通常我们在Gemfile中编写依赖关系:

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

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

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

这是什么意思 ?

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

 bundle install 

那么当前使用的gem可以随时不同 。 你的应用程序使用1.4.4版本, 8个月前没有任何问题,但如果你现在试图build立它,你会得到版本1.4.9 。 也许这是与最新版本的nokogiri ,你使用1.4.4的真棒function是不可用的,等等。

为了防止使用Gemfile.lock这种问题。 在Gemfile.lock只会写入确切的版本 ,因此只会安装这些版本。 这意味着,如果您使用Gemfile.lock分发应用程序,则每台计算机都将安装相同的Gemfile.lock ,并且最重要的是它们将获得相同的版本 。 这会给你一个稳定而通用的部署堆栈。

Gemfile.lock是如何创build的?

它是自动创build的第一个:

 bundle install 

命令。 之后,每次运行bundle install ,软件包将首先查找Gemfile.lock并安装指定的gem。 将这个文件分发到您的项目中是一种习惯,以保持一致性和稳定性。

如何更新Gemfile.lock?

如果您对最新版本的应用感到满意,则可以更新Gemfile.lock 。 只是反映你对Gemfile的改变。 这意味着将相关性更改为Gemfile新的精确版本。 之后运行:

 bundle install 

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

Gemfile.lock

当你运行bundle安装时,Bundler会将你使用的所有gem的完整名称和版本(包括Gemfile(5)中指定的gem的依赖关系)保存到名为Gemfile.lock的文件中。

Bundler在随后的所有调用中使用此文件来捆绑安装,这可以保证您始终使用相同的代码,即使您的应用程序跨机器移动。

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

因此,你应该检查你的Gemfile.lock版本控制。 如果你不这样做,那么检查你的版本库(包括你的生产服务器)的每台机器将再次parsing所有的依赖关系,这将导致不同版本的第三方代码被使用,如果Gemfile(5)他们的依赖关系已被更新。