了解Gemfile.lock文件

时间:2011-09-22 15:40:37

标签: ruby bundler gemfile.lock

运行bundle install命令后,在工作目录中创建'Gemfile.lock '。该文件中的指令是什么意思?

例如,我们来看以下文件:

PATH
  remote: .
  specs:
    gem_one (0.0.1)

GEM
  remote: http://example.org/
  specs:
    gem_two (0.0.2)
    gem_three (0.0.3)
      gem_four (0.0.4)

PLATFORMS
  platform

DEPENDENCIES
  gem_two
  gem_one!

PATH ',' GEM ',' PLATFORMS '和' DEPENDENCIES '描述了什么?他们都需要吗?

什么应该包含'远程'和'规范'子指令?

' DEPENDECIES '组中宝石名称后的感叹号是什么意思?

7 个答案:

答案 0 :(得分:73)

您可以在bundler website中找到更多相关信息(为方便起见,下面重点介绍):

  

在开发应用程序一段时间后,请与Gemfile和 Gemfile.lock 快照一起检查应用程序。现在,您的存储库记录了您上次使用时确定该应用程序有效的所有宝石的确切版本......

     

这一点很重要: Gemfile.lock 使您的应用程序成为您自己的代码和上次运行的第三方代码的单个程序包,以确保一切正常。在Gemfile中指定您所依赖的第三方代码的确切版本将不会提供相同的保证,因为Gems通常会为其依赖项声明一系列版本。

答案 1 :(得分:34)

关于感叹号,我刚刚发现它是通过:git获取的宝石,例如

gem "foo", :git => "git@github.com:company/foo.git"

答案 2 :(得分:17)

我在最近几个月里花了很多时间搞乱Gemfiles和Gemfile.locks,同时构建了一个自动依赖更新工具 1 。下面的内容远非确定,但它是理解Gemfile.lock格式的一个很好的起点。您可能还想查看Bundler的lockfile parser

的源代码

您将在Bundler 1.x生成的锁文件中找到以下标题:

GEM (可选但很常见)

这些是源自Rubygems服务器的依赖项。这可能是Rubygems.org上的主要Rubygems索引,或者它可能是一个自定义索引,例如可以从Gemfury和其他人那里获得的索引。在本节中,您将看到:

  • remote:一行或多行指定Rubygems索引的位置
  • specs:依赖项列表及其版本号以及对任何子依赖项的约束

GIT (可选)

这些是来自给定git远程的依赖项。您将在每个git遥控器中看到这些部分中的不同部分,并且您将在每个部分中看到:

  • remote: git remote。例如,git@github.com:rails/rails
  • revision:提交引用Gemfile.lock被锁定为
  • tag:(可选)Gemfile
  • 中指定的标记
  • specs:在此远程处找到的git依赖项及其版本号以及对任何子依赖项的约束

路径(可选)

这些是源自Gemfile中提供的给定path的依赖项。对于每个路径依赖项,您将看到这些部分中的不同部分,并且在每个部分中您将看到:

  • remote:路径。例如,plugins/vendored-dependency
  • specs:在此远程处找到的git依赖项及其版本号以及对任何子依赖项的约束

<强> PLATFORMS

生成Gemfile.lock的Ruby平台。如果Gemfile中的任何依赖项指定了一个平台,那么当在该平台上生成lockfile时(例如,通过安装),它们将仅包含在Gemfile.lock中。

<强> DEPENDENCIES

Gemfile中指定的依赖项列表,以及在那里指定的版本约束。

使用除主Rubygems索引以外的源指定的依赖关系(例如,git依赖关系,基于路径,依赖关系)具有!,这意味着它们被“固定”到该源 2 (虽然有时候必须在Gemfile中查看以确定)。

RUBY VERSION (可选)

创建此Gemfile.lock时Gemfile中指定的Ruby版本。如果在.ruby_version文件中指定了Ruby版本,则该部分将不存在(因为Bundler将认为Gemfile / Gemfile.lock与安装程序的Ruby版本无关)。

捆绑(Bundler&gt; = v1.10.x)

用于创建Gemfile.lock的Bundler版本。用于提醒安装程序更新其Bundler版本(如果它早于创建该文件的版本。)

PLUGIN SOURCE (可选且非常罕见)

理论上,Gemfile可以指定Bundler插件,以及gems 3 ,然后在此处列出。在实践中,截至2017年7月,我不知道任何可用的插件.Bundler的这部分仍在积极开发中!

  1. https://dependabot.com
  2. https://github.com/bundler/bundler/issues/4631
  3. http://andre.arko.net/2012/07/23/towards-a-bundler-plugin-system/

答案 3 :(得分:8)

在我看来,PATH直接从你的gemspec列出了第一代依赖项,而GEM列出了第二代依赖项(即你的依赖项所依赖的)和来自你的Gemfile的依赖项。 PATH :: remote是.因为它依赖于当前目录中的本地gemspec来查找PATH :: spec中的内容,而GEM :: remote是rubygems.org,因为它是必须的去了解GEM :: spec。

中的内容

在Rails插件中,您将看到PATH部分,但不会在Rails应用程序中看到。由于应用程序没有gemspec文件,因此无法放入PATH。

关于依赖性,gembundler.com州:

Runtime dependencies in your gemspec are treated like base dependencies, 
and development dependencies are added by default to the group, :development

rails plugin new my_plugin生成的Gemfile说了类似的内容:

# Bundler will treat runtime dependencies like base dependencies, and
# development dependencies will be added by default to the :development group.

这意味着

之间的区别
s.add_development_dependency "july" # (1)

s.add_dependency "july" # (2)

是(1)只在开发环境中的Gemfile.lock(因此在应用程序中)中包含“july”。因此,当您运行bundle install时,您将不仅在PATH下看到“7月”,而且在DEPENDENCIES下看到“7月”,但仅在开发中。在生产中,它根本就不存在。但是,当你使用(2)时,你只会在PATH中看到“july”,而不是在DEPENDENCIES中,但是当你bundle install从生产环境(即包含你的其他宝石)时它会出现依赖),而不仅仅是发展。

这些只是我的观察,我无法完全解释为什么会这样,但我欢迎进一步的评论。

答案 4 :(得分:8)

Bundler是一个Gem管理器,它通过跟踪和安装所需的确切gem和版本,为Ruby项目提供一致的环境。

Gemfile和Gemfile.lock是Bundler gem给出的主要产品(Bundler本身就是一个宝石)。

Gemfile包含您对gem(s)的项目依赖关系,您手动提及指定的版本,但这些gem(s)inturn取决于Bundler自动解析的其他gem。

Gemfile.lock包含Gemfile中所有gem的完整快照以及相关的依赖项。

当你第一次调用bundle install时,它会创建这个Gemfile.lock并在所有后续的bundle install调用中使用这个文件,这确保你安装了所有的依赖项并且将跳过依赖项安装。

使用不同的计算机共享代码时也会发生相同的情况

你与Gemfile一起分享你的Gemfile.lock,当你在其他机器上运行bundle install时,它将引用你的Gemfile.lock并跳过依赖关系解析步骤,而不是安装你所有相同的依赖gem。在原始计算机上使用, 维护多台计算机的一致性

为什么我们需要在多台机器上保持一致性?

  • 在不同的计算机上运行不同的版本可能会导致损坏 代码

  • 假设您的应用使用版本1.5.3并且它在14个月前工作了 没有任何问题,你尝试安装在不同的机器上 没有Gemfile.lock,现在你得到版本1.5.8。也许它已经坏了 一些宝石的最新版本和您的应用程序将 失败。保持一致性至关重要(首选
    实践)。

也可以通过使用更新Gemfile.lock中的gem bundle update

这是基于conservative updating

的概念

答案 5 :(得分:1)

似乎没有明确的文件谈论Gemfile.lock格式。也许是因为Gemfile.lock仅在内部被捆绑使用。

但是,由于Gemfile.lockGemfile的快照,这意味着其所有信息都应来自Gemfile(如果未在Gemfile中指定,则来自默认值)。

对于GEM,它列出了您在Gemfile中直接或间接引入的所有依赖关系。 remote下的GEM告诉我们获取宝石的位置,这是由Gemfilesource指定的。

如果未从remote获取某个gem,PATH会告知该位置找到它。当您声明依赖关系时,PATH的信息来自Gemfile中的path

PLATFORM来自here

对于DEPENDENCIES,它是由bundle解析的依赖关系的快照。

答案 6 :(得分:0)

  

&#39; DEPENDECIES&#39;中宝石名称之后的感叹号是什么?小组意味着什么?

使用&#34; https://rubygems.org&#34;以外的来源安装gem时会出现感叹号。