我能否阻止Bundler将RUBY VERSION添加到Gemfile.lock文件中?

15
每当我在命令行上运行任何gem命令时,Bundler都会坚持修改我的Gemfile.lock文件并添加这一行代码:
RUBY VERSION
   ruby 2.2.2p95

我不想将这个提交到我们的存储库,因为这意味着使用不同的 Ruby 2.2.2 补丁级别的每个开发人员都会与我在提交上发生冲突。(我已经接受了与 BUNDLED_WITH 行类似的问题。) 但是,除非我提交那一行,否则我将无法部署,因为我们的部署是通过一个 rake 任务运行的,并且运行部署会导致 Bundler 添加此块,随后部署进程说:"等等!你的工作树很脏!你可能正在部署不完整的更改!!!1!" (嗯,不是字面意义上的,但你懂我的意思。)

我能告诉 Bundler 在 Gemfile.lock 中忽略 RUBY VERSION(最理想情况下还有 BUNDLED_WITH)吗?这样我们就不必做这种荒谬的操作了吗?

(如何防止 bundler 将平台信息添加到 Gemfile.lock 看起来是同样的问题,但没有答案。)

3个回答

9

我并不这样认为,但也许没问题:

从2.1.0开始,Ruby不再针对特定版本发布多个补丁级别版本。请参见How do version numbers work for MRI Ruby?上接受的答案。

2.2.2p95是唯一会发布的2.2.2版本的补丁级别。'p95'意味着自2.2.0以来已有95个提交。

由于你们的整个团队都将使用2.2.2,因此在Gemfile.lock中保留这个版本不应该引起问题。(前提是每个人都更新Bundler到可以做到这一点的版本。否则,在添加和删除ruby版本时仍将存在冲突。)


3
然而事实证明,我们仍然会发生提交冲突,不是因为Ruby版本的问题,而是因为不同版本的Bundler添加和删除了这个块。 叹气 - pjmorse
@pjmorse 我认为让团队成员使用相同的Bundler版本是很好的。如果你需要锁定gems,为什么不使用Bundler呢? - Franklin Yu
@FranklinYu 很好的问题。我认为因为Bundler是开发工具而不是应用程序的直接依赖,所以锁定其版本比锁定gem版本不那么重要。(此外,如果您的团队正在开发多个应用程序,您需要协调跨应用程序锁定Bundler的版本,这可能会很麻烦。您实际上是在承诺您的团队将同步更新Bundler。) - pjmorse
@pjmorse我在使用多个应用程序时实际上没有遇到任何问题,因为旧的Bundler可以完全解析由新的Bundler生成的Gemfile.lock。实际上这不是锁定,而是通知其他团队成员有一个新的Bundler版本可供使用。它不会强制任何人升级,只是告诉他们“你没有使用团队中的最新版本”。如果没有成员或计算机加入团队,它将保持在该版本。 - Franklin Yu
@pjmorse 实际上,我确实看到 其他人遇到了问题,但 Bundler 团队似乎并不后悔这个决定。通常情况下,我的团队更愿意不违背 gem 开发者的意愿,以便让我们的工作更轻松。 - Franklin Yu

1
不,至少在我写这篇文章时的Bundler版本中无法删除此块。此块被添加到Bundler::Definition的#to_lock方法中。它唯一包含的条件是if locked_ruby_version,而locked_ruby_version是一个返回现有锁定文件(Gemfile.lock)中定义的版本或系统Ruby的方法 - Bundler尝试非常努力地避免让locked_ruby_version返回假值。

-4
如果您正在使用像Git这样的版本控制工具,您可以将Gemfile.lock添加到您的.gitignore文件中。
这样,每当您推送新更改时,您就不会推送Gemfile.lock。特别是其他开发人员不需要它 - 一旦他们运行bundle,bundle将在完成后创建一个新的Gemfile.lock。

6
Gemfile.lock 的整个目的是根据 Gemfile 中指定的要求锁定确切的依赖版本。如果您想要可重现的环境,提交 Gemfile.lock 几乎是必需的。 - jackrabbit
2
不将 Gemfile.lock 放入 git 仓库并不是一个选项。实际上,我们确实希望团队中的所有开发人员都使用项目中所有 gem 的相同版本。 - pjmorse

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接