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

Sha*_*h c 119 ruby ruby-on-rails bundler gemfile gemfile.lock

我是Ruby on Rails的初学者,我使用的是Rails 3.0.9.

GemfileGemfile.lockRails有什么区别?

Dyl*_*kow 151

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

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

查看Bundler的用途和原理,特别是将代码检查到版本控制部分.

  • 这就是它应该*工作的方式 - 但显然`gemfile.lock`在某些情况下包含'open'版本(例如`rails(4.0.0)`需要`bundler(> = 1.3.0,<2.0)`) ,这会导致问题.知道如何避免那些"开放"的依赖吗? (2认同)

Fat*_*lan 149

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

gem "nokogiri", "~> 1.4.4"
gem 'bcrypt-ruby', '~> 3.0.0'
gem 'uglifier', '>= 1.2.3'
..
Run Code Online (Sandbox Code Playgroud)

在这里你基本上说:" 我想要nokogiri,只要它比版本1.4.4更大 ",等等.现在假设我已经设置了我的Gemfile 8个月前,我成功设置了我的应用程序这个要求.8个月前nokogiri版本是1.4.4.我的rails应用程序运行完美,没有任何问题.

现在想想我正在努力建立同样的东西Gemfile.但是如果我们看看nokogiri版本,我们会看到当前的稳定版本已经变为1.4.9.这意味着如果我们尝试构建,bundler将安装版本1.4.9的nokogiri(假设我们没有Gemfile.lock).

这是什么意思 ?

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

bundle install
Run Code Online (Sandbox Code Playgroud)

那么目前使用的宝石可以随时变化.您的应用程序使用的是1.4.4版,它在8个月前运行没有任何问题,但如果您现在尝试构建它,则会获得1.4.9版本.也许它已经被最新版本打破了nokogiri,你使用1.4.4的强大功能并不是更多,等等.

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

如何创建Gemfile.lock?

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

bundle install
Run Code Online (Sandbox Code Playgroud)

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

如何更新Gemfile.lock?

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

bundle install
Run Code Online (Sandbox Code Playgroud)

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

  • 一个非常好的,清晰的描述(我投票); 但是一个挑剔,但是:`nokogiri~> 1.4.4`不允许安装`1.5.3`; 允许的最大值是`1.4.x`,其中`x> = 4`(对于nokogiri,它将是'1.4.7`).`〜>`运算符意味着使用的gem中的_last digit_可以"大于"给定的版本.例如,`foo~> abcd`意味着任何版本的`foo`都可以,只要它仍然是abc {something},其中{something}`> =`d.另见[相关问题](http://stackoverflow.com/questions/5170547/what-does-tilde-greater-than-mean-in-ruby-gem-dependencies) (18认同)
  • @Jonny,`〜> 1.4.4`相当于`> = 1.4.4和<1.5`.请参见http://bundler.io/v1.5/gemfile.html.对于确切的版本,只需使用`gem'foo','1.4.4'. (2认同)
  • 很好的答案,但请澄清“**更新 Gemfile.lock?**”:本节是否说即使存在“Gemfile.lock”,“bundle install”也会检查“Gemfile”并对“Gemfile”实施新的限制。锁`? (2认同)

Aje*_*jey 6

Gemfile.lock

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

Bundler 在所有后续调用 bundle install 中使用此文件,这保证您始终使用完全相同的代码,即使您的应用程序在机器之间移动。

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

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