本文介绍了使用捆绑包_冻结的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我经常在Docker文件中看到以下行

ENV BUNDLE_FROZEN=true
我查看了捆绑器文档,上面写着&禁止对Gemfile&进行更改。但我搞不懂为什么有人想要禁止人们更改Gemfile。毕竟,随着项目的发展,我们可能会添加新的宝石。谁能解释一下我们为什么需要这个env var,如何使用它,什么时候使用它,以及为什么它经常出现在Docker文件中?

推荐答案

如果此环境变量检测到Gemfile与附带的Gemfile.lock之间存在差异,则它将更改Bundler的行为。

默认情况下,当运行bundle install时,如果添加了任何gem或更改了约束,bundler将尝试更新Gemfile.lock。在生产部署中,这通常是不可取的,因为这可能会导致安装未经完全测试的意外版本的gem。

通过设置BUNDLE_FROZEN=true,捆绑器将(1)需要现有的Gemfile.lock,并且(2)将拒绝使用更新的信息更新此Gemfile.lock。这可确保您的生产部署仅使用锁定在提交的Gemfile.lock中的确切gem版本。

这里的工作流程是,每次向Gemfile添加gem时,还会在本地计算机上运行bundle install以更新Gemfile.lock。然后,您可以测试更改并提交更新的Gemfile.lock。以后部署应用程序时,这两个文件是同步的。使用BUNDLE_FROZEN=true,您可以确保在生产中使用您在开发期间指定和测试的完全相同的环境。

最后,这基本上是一种故障保护措施,可以强制您(和您的同事)在更改Gemfile或任何依赖项后主动更新Gemfile.lock。如果您总是这样做(您确信如此),则不需要在生产中设置BUNDLE_FROZEN。但是,如果您设置了Bundler,如果您忘记了您可能没有完全测试过的gem版本,而不是静默安装,那么bundler将大声失败。

这篇关于使用捆绑包_冻结的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

11-02 15:18