Gemfile.lock应该包含在.gitignore中吗?

aar*_*ona 483 git version-control bundler

我对bundler及其生成的文件有点新意.我有一个来自GitHub的git repo的副本,这是由很多人贡献的,所以我很惊讶地发现bundler创建了一个在repo中不存在但不在.gitignore列表中的文件.

因为我已经分叉它,我知道将它添加到repo不会破坏主回购的任何东西,但是如果我做一个pull请求,它会导致问题吗?

应该Gemfile.lock包含在存储库中吗?

rwi*_*ams 530

假设您没有编写rubygem,Gemfile.lock应该在您的存储库中.它用作所有必需宝石及其依赖项的快照.这样,每次部署时,bundler都不必重新计算所有gem依赖项等.

来自cowboycoded的评论.

如果你正在处理gem,那么不要检查你的Gemfile.lock.

这是一篇很好的文章,解释锁文件是什么.

  • 取决于你在做什么.如果你正在处理gem,那么不要检查你的Gemfile.lock.如果您正在使用Rails应用程序,那么请检查您的Gemfile.lock.更多信息 - http://yehudakatz.com/2010/12/16/clarifying-the-roles-of-the-gemspec-and-gemfile/ (85认同)
  • 请不要那样做!! 保持你的Gemfile.lock在哪里!就像所说[这里](https://github.com/plataformatec/devise/pull/3147)和[这里](https://github.com/rails/rails/pull/18951#issuecomment-74888396). (3认同)

ndb*_*ent 50

当您正在开发需要具有可配置数据库适配器的开源Rails应用程序时,会发生真正的问题.我正在开发Fat Free CRM的Rails 3分支.我的偏好是postgres,但我们希望默认数据库是mysql2.

在这种情况下,Gemfile.lock仍然需要使用默认的宝石集来检查,但我需要忽略我在计算机上对其所做的更改.为此,我运行:

git update-index --assume-unchanged Gemfile.lock
Run Code Online (Sandbox Code Playgroud)

并扭转:

git update-index --no-assume-unchanged Gemfile.lock
Run Code Online (Sandbox Code Playgroud)

在您的内容中包含类似以下代码的内容也很有用Gemfile.这将根据您的database.yml加载相应的数据库适配器gem.

# Loads the database adapter gem based on config/database.yml (Default: mysql2)
# -----------------------------------------------------------------------------
db_gems = {"mysql2"     => ["mysql2", ">= 0.2.6"],
           "postgresql" => ["pg",     ">= 0.9.0"],
           "sqlite3"    => ["sqlite3"]}
adapter = if File.exists?(db_config = File.join(File.dirname(__FILE__),"config","database.yml"))
  db = YAML.load_file(db_config)
  # Fetch the first configured adapter from config/database.yml
  (db["production"] || db["development"] || db["test"])["adapter"]
else
  "mysql2"
end
gem *db_gems[adapter]
# -----------------------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)

我不能说这是否是既定的最佳实践,但对我来说效果很好.

  • 非常有用的信息...不知道为什么你只得到3分而一个不太有用的答案有50分.哦,是的,看一下日期戳.(SO的一个重大失败是在提出问题后很快就会回答不成比例的好处.) (2认同)

Joe*_*ang 33

我和我的同事有不同的Gemfile.lock,因为我们使用不同的平台,windows和mac,而我们的服务器是linux.

我们决定在repo中删除Gemfile.lock并在git repo中创建Gemfile.lock.server,就像database.yml一样.然后在将其部署到服务器上之前,我们使用cap deploy hook将Gemfile.lock.server复制到服务器上的Gemfile.lock

  • 我有一个应用程序,我在OSX中开发,然后必须部署在Windows服务器上.使用git跟踪Gemfile.lock被证明是个坏主意所以它确实放在我的.gitignore文件中.许多宝石需要针对不同环境的不同版本.理想情况下,你应该避免在这种情况下,但我别无选择(该死你的IT部门!) (5认同)

Pet*_*epo 12

2021 年的简单答案: Gemfile.lock 也应该在 Rubygems 的版本控制中。现在接受的答案是 11 岁。

这里有一些推理(从评论中挑选出来):

@josevalim https://github.com/heartcombo/devise/pull/3147#issuecomment-52193788

Gemfile.lock 应保留在存储库中,因为贡献者和开发人员应该能够分叉该项目并使用保证工作的版本运行它。

@rafaelfranca https://github.com/rails/rails/pull/18951#issuecomment-74888396

我认为即使对于插件来说,忽略锁定文件也不是一个好主意。

这意味着“git clone;bundle;rake test”序列不能保证通过,因为您的数十个依赖项之一已升级并使您的代码中断。另外,正如 @chancancode 所说,这使得平分变得更加困难。

Rails 在 git 中也有 Gemfile.lock:


oma*_*oma 11

同意r-dub,将其保留在源代码管理中,但对我而言,真正的好处是:

在相同的环境中进行协作(无视windohs和linux/mac的东西).在Gemfile.lock之前,下一个安装项目的人可能会看到各种令人困惑的错误,责备自己,但他只是那个幸运的人获得下一个版本的超级宝石,破坏了现有的依赖关系.

更糟糕的是,这发生在服务器上,获得未经测试的版本,除非遵守纪律并安装确切的版本.Gemfile.lock使这个显式,它将明确告诉您您的版本是不同的.

注意:记得分组东西,如:开发和:测试


Wil*_*ler 11

Bundler文档也解决了这个问题:

原文:http://gembundler.com/v1.3/rationale.html

编辑:http://web.archive.org/web/20160309170442/http: //bundler.io/v1.3/rationale.html

请参阅"将代码检入版本控制"一节:

在开发应用程序一段时间后,请检查应用程序以及Gemfile和Gemfile.lock快照.现在,您的存储库记录了您上次确认应用程序运行时所使用的所有gem的确切版本.请记住,当你的Gemfile中列出只有三个宝石(有不同程度的版本严格的),您的应用程序依赖于几十个宝石,一旦你考虑到所有的宝石隐含要求你依赖.

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

下次在同一台机器上运行bundle install时,bundler会看到它已经拥有您需要的所有依赖项,并跳过安装过程.

不要检入.bundle目录或其中的任何文件.这些文件特定于每台特定计算机,用于在bundle install命令的运行之间保留安装选项.

如果您运行了bundle pack,则捆绑包所需的gem(尽管不是git gem)将被下载到vendor/cache中.如果您需要的所有宝石都存在于该文件夹中并签入源控件,Bundler可以在不连接到Internet(或RubyGems服务器)的情况下运行.这是一个可选步骤,由于源控件存储库的大小增加,因此不建议这样做.


gro*_*ser 7

没有 Gemfile.lock 意味着:

  • 新的贡献者不能运行测试,因为奇怪的事情失败了,所以他们不会贡献或得到失败的 PR ......糟糕的第一次体验。
  • 如果您丢失了本地 Gemfile.lock,您将无法回到 ax 年的项目并修复错误而不必更新/重写项目

-> 总是检查 Gemfile.lock,如果你想更彻底,让 travis 删除它https://grosser.it/2015/08/14/check-in-your-gemfile-lock/