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

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

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


#1楼

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服务器)的情况下运行。 这是一个可选步骤,由于源控件存储库的大小增加,因此不建议这样做。


#2楼

派对有点晚了,但答案仍然花了我时间和外国读书来理解这个问题。 所以我想总结一下我发现的有关Gemfile.lock的内容。

在构建Rails应用程序时,您在本地计算机中使用某些版本的gem。 如果你想避免生产模式和其他分支中的错误,你必须在任何地方使用那个Gemfile.lock文件,并告诉bundler每次更改时bundle以重建gem。

如果生产机器上的Gemfile.lock已经改变而且Git不允许你git pull ,你应该写git reset --hard以避免该文件更改并再次写git pull


#3楼

没有Gemfile.lock意味着:

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

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


#4楼

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

来自cowboycoded的评论。

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

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


#5楼

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

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

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

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


#6楼

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

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

git update-index --assume-unchanged Gemfile.lock

并扭转:

git update-index --no-assume-unchanged Gemfile.lock

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]
# -----------------------------------------------------------------------------

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


#7楼

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

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

Gemfile.lock应该包含在.gitignore中吗?相关推荐

  1. 如何使Git“忘记”已跟踪但现在位于.gitignore中的文件?

    git正在跟踪一个文件,但是现在该文件在.gitignore列表中. 但是,该文件在编辑后一直以git status显示. 您如何迫使git完全忘记它? #1楼 如果由于其他人可能需要而无法git r ...

  2. pandas使用isin函数和all函数判断dataframe特定数列中是否包含指定列表中的全部内容

    pandas使用isin函数和all函数判断dataframe特定数列中是否包含指定列表中的全部内容(checking if the dataframe column contains all val ...

  3. thinkphp的控制器包含在Url中时注意区分大小写

    thinkphp的控制器包含在Url中时要区分大小写. 转载于:https://www.cnblogs.com/npk19195global/p/4531961.html

  4. python中csv文件通过什么表示字符_python – 如果行包含CSV文件中的字符串,则删除该行...

    我在删除包含一列中的字符串的文本文件中的行时遇到问题.到目前为止,我的代码无法删除该行,但它能够读取文本文件并将其作为CSV文件保存到单独的列中.但这些行不会被删除. 这就是该列中的值如下所示: Sh ...

  5. wxWidgets:将 PNG 图像文件包含到可执行文件中

    wxWidgets:将 PNG 图像文件包含到可执行文件中 wxWidgets:将 PNG 图像文件包含到可执行文件中 处理图像的可能策略 将图像嵌入到可执行文件中 实用程序列表 hxtools bi ...

  6. 每天一道LeetCode-----在字符串s中找到最短的包含字符串t中所有字符的子串,子串中字符顺序无要求且可以有其他字符

    Minimum Window Substring 原题链接Minimum Window Substring 要求在源字符串s中找到长度最短的子串,这个子串包含目标字符串t中的所有字符,字符顺序没有要求 ...

  7. strspn php,php返回在字符串中包含 charlist 参数中指定的字符数目的函数strspn()

    实例 返回在字符串 "Hello world!" 中包含字符 "kHlleo" 的数目:<?php echo strspn("Hello wor ...

  8. Python检查特定值是否包含在列表中

    python 检查特定值是否包含在列表中 # -*- coding: utf-8 -*-listA = ["23", "45", "78", ...

  9. 切换不同的数据状态布局,包含加载中、空数据和出错状态,可自定义状态布局

    代码地址如下: http://www.demodashi.com/demo/12318.html StatusLayoutManager 切换不同的数据状态布局,包含加载中.空数据和出错状态. git ...

最新文章

  1. 【组队学习】【31期】组队学习内容详情
  2. sql数据库查询聚合函数_如何使用SQL Server数据质量服务确保正确的数据聚合
  3. 信息图表是如何炼成的(三):阶层结构与isometric
  4. IT人士易犯4大职业病 鼠标手居第一位
  5. fish-ui 一套基于vue2的ui组件库
  6. 计算机辅助翻译 教学大纲,计算机辅助翻译本科课程教学大纲翻译本科.doc
  7. 基于IAR for RH850的瑞萨RH850 FCL库用法介绍
  8. QQ获取好友列表接口 -
  9. 服务端(java)实现微信支付二次签名
  10. Unity iOS使用ASTC格式纹理实践
  11. 汽车维修企业管理【8】
  12. 半实物仿真技术在复杂控制系统研发过程中的典型应用
  13. Unity 回合制战斗系统(中级篇)-血条和伤害数值
  14. 推荐三个图片编辑软件给你
  15. css 字体颜色 样式大全
  16. java远控_利用Java实现远程控制
  17. 北京大学计算机系丁万东,第八届北京大学程序设计大赛圆满落幕 陈瑜希等同学获冠军...
  18. Python之520爱的表白
  19. Retrofit2深度解析
  20. 高等数学笔记:关于等价无穷小替换的一个猜想

热门文章

  1. 3D图形学的线性代数的通俗解释。
  2. 【剑指offer-Java版】20顺时针打印矩阵
  3. setContentView是如何一步一步被显示出来的?
  4. 快捷简易统计图表模型设计与实现
  5. 创建型模式--抽象工厂模式
  6. es6 语法 (Promise)
  7. Android -- ViewPager切换动画,PageTransformer
  8. MySQL数据库学习笔记(十一)----DAO设计模式实现数据库的增删改查(进一步封装JDBC工具类)...
  9. javascript 之clientHeight、scrollHeight、offsetHeight
  10. 多人在线游戏服务器端开发心得(转)