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

2019-05-12 20:27发布

我是一个初学者到Ruby on Rails和我使用Rails 3.0.9。

是有什么区别GemfileGemfile.lock Rails中?

Answer 1:

Gemfile是,您可以指定要使用的宝石,并允许您指定哪个版本。

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

退房捆扎机的目的和理由 ,特别是检查你的代码版本控制部分。



Answer 2:

通常我们写的依赖关系的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。 这意味着,如果我们试图构建,打包器将安装引入nokogiri的1.4.9版本(假设我们没有Gemfile.lock )。

这是什么意思 ?

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

bundle install

然后当前使用的宝石可以在任何时间不同 。 您的应用程序使用的版本1.4.4,它工作8个月前没有任何问题,但如果你现在尝试构建它,你得到的版本1.4.9。 也许这与最新版本打破nokogiri ,你1.4.4使用的真棒功能并不多用,等等。

为了防止这种问题Gemfile.lock使用。 在Gemfile.lock唯一确切版本被写入,因此只有这些将被安装。 这意味着如果你有一个发布应用程式Gemfile.lock ,每台机器将安装和最重要的,他们都得到相同的版本相同的宝石。 这会给你一个稳定的,共同部署堆栈。

Gemfile.lock的是怎样产生的?

它会自动创建的第一个:

bundle install

命令。 当你运行每次bundle install ,包会首先查找Gemfile.lock并安装指定有宝石。 这是发布你的项目中这个文件,以一贯性和稳定性提供了一个习惯。

如何更新Gemfile.lock的?

如果你感到快乐与最新版本的应用程序比你可以更新Gemfile.lock 。 只是反映变化Gemfile 。 这意味着改变依赖于新的精确版本Gemfile 。 该运行后:

bundle install

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



Answer 3:

该Gemfile.lock的

当您运行包安装,捆扎机将持续存在,你使用的所有宝石(包括在Gemfile中(5)中指定的宝石的依赖)到一个名为Gemfile.lock的文件的全名和版本。

捆绑使用的所有后续调用这个文件捆绑安装,保证你总是使用相同的确切的代码,甚至跨机器的应用程序移动。

因为单向依赖分辨率的作品,即使是看似很小的变化(例如,更新在你的Gemfile宝石的依赖点释放(5))可能会导致被需要完全不同的宝石,以满足所有的依赖关系。

因此,你应该检查你Gemfile.lock的版本控制。 如果你不这样做,每次检查出你的资料库(包括生产服务器)的机器将再次解决所有的依赖,这将导致如果正在使用不同版本的第三方代码的任何在Gemfile中的宝石(5)或任何的他们依赖已更新。



文章来源: What is the difference between Gemfile and Gemfile.lock in Ruby on Rails