我对捆绑器和它生成的文件有点陌生。我有一个副本的git回购从GitHub,这是由许多人贡献,所以我很惊讶地发现,捆绑器创建了一个文件,不存在的回购,不在.gitignore列表。
因为我已经fork了它,我知道将它添加到回购中不会破坏主回购的任何东西,但如果我做一个pull请求,它会引起问题吗?
应该Gemfile。锁包含在存储库中?
我对捆绑器和它生成的文件有点陌生。我有一个副本的git回购从GitHub,这是由许多人贡献,所以我很惊讶地发现,捆绑器创建了一个文件,不存在的回购,不在.gitignore列表。
因为我已经fork了它,我知道将它添加到回购中不会破坏主回购的任何东西,但如果我做一个pull请求,它会引起问题吗?
应该Gemfile。锁包含在存储库中?
当前回答
这里的其他答案是正确的:是的,你的Ruby应用程序(不是你的Ruby gem)应该包含Gemfile。锁定回购。要详细说明为什么它应该这样做,请继续阅读:
我错误地认为,每个环境(开发、测试、阶段、测试……)都进行了捆绑安装来构建自己的Gemfile.lock。我的假设是基于Gemfile。Lock不包含任何分组数据,如:test、:prod等。这种假设是错误的,因为我在一个令人痛苦的地方问题中发现了这一点。
经过进一步调查,我很困惑为什么我的Jenkins构建显示获取一个特定的宝石(ffaker, FWIW)成功,但当应用程序加载并需要ffaker时,它说文件未找到。WTF ?
更多的调查和实验显示了这两个文件的功能:
首先,它使用Gemfile。锁定去获取所有的宝石,即使是那些不会使用在这个特定的环境。然后它使用Gemfile选择在这个环境中实际使用哪些获取的宝石。
因此,尽管它在第一步中基于Gemfile获取了宝石。锁,它不包括在我的:测试环境,基于组在Gemfile。
修复(在我的情况下)是移动宝石'ffaker'从:开发组到主组,所以所有的env都可以使用它。(或者,将其添加到:development,:test,视情况而定)
其他回答
这里的其他答案是正确的:是的,你的Ruby应用程序(不是你的Ruby gem)应该包含Gemfile。锁定回购。要详细说明为什么它应该这样做,请继续阅读:
我错误地认为,每个环境(开发、测试、阶段、测试……)都进行了捆绑安装来构建自己的Gemfile.lock。我的假设是基于Gemfile。Lock不包含任何分组数据,如:test、:prod等。这种假设是错误的,因为我在一个令人痛苦的地方问题中发现了这一点。
经过进一步调查,我很困惑为什么我的Jenkins构建显示获取一个特定的宝石(ffaker, FWIW)成功,但当应用程序加载并需要ffaker时,它说文件未找到。WTF ?
更多的调查和实验显示了这两个文件的功能:
首先,它使用Gemfile。锁定去获取所有的宝石,即使是那些不会使用在这个特定的环境。然后它使用Gemfile选择在这个环境中实际使用哪些获取的宝石。
因此,尽管它在第一步中基于Gemfile获取了宝石。锁,它不包括在我的:测试环境,基于组在Gemfile。
修复(在我的情况下)是移动宝石'ffaker'从:开发组到主组,所以所有的env都可以使用它。(或者,将其添加到:development,:test,视情况而定)
来自TrinitronX的2022年更新
快进到2021年,现在Bundler文档(web存档)现在说要提交Gemfile。锁在宝石里面…¯_()_/¯我想这对开发人员来说是有意义的,并且在开始一个项目时易于使用。然而,现在CI作业需要确保删除任何丢失的Gemfile。锁定文件以针对其他版本进行测试。
遗产答案~2010
假设你不是在写rubygem, Gemfile。Lock应该在存储库中。它被用作所有所需宝石及其依赖关系的快照。这样,bundle就不必在每次部署时重新计算所有gem依赖项。
下面是cowboycoded的评论:
如果你正在使用宝石,那么不要签入你的Gemfile.lock。如果你正在开发一个Rails应用程序,那么一定要检入你的Gemfile.lock。
这里有一篇很好的文章解释了什么是锁文件。
同意r-dub,把它放在源代码控制中,但对我来说,真正的好处是:
在相同的环境下协作(忽略windows和linux/mac的东西)。Gemfile之前。Lock,下一个安装项目的人可能会看到各种令人困惑的错误,责怪自己,但他只是一个幸运的人,得到了下一个版本的super gem,打破了现有的依赖关系。
更糟糕的是,这发生在服务器上,得到未经测试的版本,除非遵守规则并安装准确的版本。Gemfile。Lock使这个显式,它会显式地告诉你你的版本不同。
注意:记得把东西分类,比如:development和:test
没有Gemfile。锁的意思是:
新的贡献者不能运行测试,因为奇怪的事情失败了,所以他们不会贡献或者得到失败的pr……糟糕的初次体验。 如果你丢失了本地的Gemfile.lock,你就不能回到x年前的项目,在不更新/重写项目的情况下修复一个错误
->总是检入Gemfile。锁,让特拉维斯删除它如果你想更彻底https://grosser.it/2015/08/14/check-in-your-gemfile-lock/
我的同事和我有不同的Gemfile。锁,因为我们使用不同的平台,Windows和mac,我们的服务器是linux。
我们决定删除Gemfile。锁在repo并在git repo中创建Gemfile.lock.server,就像database.yml一样。然后,在将其部署到服务器之前,我们将Gemfile.lock.server复制到Gemfile。使用cap部署钩子锁定服务器