我是Ruby on Rails的初学者,我正在使用Rails 3.0.9。
Rails中Gemfile
和Gemfile.lock
之间有什么区别?
答案 0 :(得分:144)
Gemfile
是您指定要使用哪些宝石的地方,并允许您指定哪些版本。
Gemfile.lock
文件是Bundler记录已安装的确切版本的位置。这样,当在另一台机器上加载相同的库/项目时,运行bundle install
将查看Gemfile.lock
并安装完全相同的版本,而不是仅使用Gemfile
并安装最新版本。 (在不同的机器上运行不同的版本可能会导致测试损坏等)。您不应该直接编辑锁文件。
查看Bundler's Purpose and Rationale,特别是将代码检入版本控制部分。
答案 1 :(得分:141)
通常我们在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 versions,我们会发现当前的稳定版本已更改为 1.4.9 。这意味着如果我们尝试构建,bundler将安装版本 1.4.9 的nokogiri(假设我们没有Gemfile.lock
)。
如您所见,如果您没有Gemfile.lock
并且运行:
bundle install
然后当前使用的宝石可以随时变化。您的应用使用了 1.4.4 版本,并且 8个月前没有任何问题,但如果您尝试构建它现在,您将获得版本 1.4.9 。也许它已经被最新版本的nokogiri
打破了,你使用 1.4.4 的强大功能不再可用,等等。
为防止出现此类问题,请使用Gemfile.lock
。在Gemfile.lock
中,只会写入确切版本,因此只会安装这些版本。这意味着如果您使用Gemfile.lock
分发您的应用,则每台计算机都会安装相同的宝石,而最重要的它们都会获得相同的版本。这将为您提供稳定且通用的部署堆栈。
它是使用第一个自动创建的:
bundle install
命令。在每次运行bundle install
之后,bundle将首先查找Gemfile.lock
并安装在那里指定的gem。习惯在项目中分发此文件以提供一致和稳定。
如果您对最新版本的应用感到满意,则可以更新Gemfile.lock
。只需将您的更改反映到Gemfile
即可。这意味着将依赖关系更改为Gemfile
中的新确切版本。在那之后:
bundle install
这会使用您最新版本的应用更新Gemfile.lock
。
答案 2 :(得分:3)
Gemfile.lock
当您运行bundle install时,Bundler会将您使用的所有gem的全名和版本(包括Gemfile(5)中指定的gems的依赖项)保存到名为Gemfile.lock的文件中。
Bundler在所有后续捆绑安装调用中使用此文件,这保证您始终使用相同的确切代码,即使应用程序在机器上移动也是如此。
由于依赖项解析的工作方式,即使是看似很小的更改(例如,更新Gemfile(5)中gem的依赖项的点释放)也可能导致需要完全不同的gem来满足所有依赖。
因此,您应该将Gemfile.lock检查到版本控制中。如果不这样做,那么检出您的存储库(包括您的生产服务器)的每台计算机都将再次解析所有依赖项,如果Gemfile(5)中的任何gem或任何gemfile,将导致使用不同版本的第三方代码他们的依赖关系已经更新。