如果明确指定了项目的 Ruby 版本,从 RVM 更改为 rbenv 会引入错误吗?



我试图弄清楚我遇到的错误是否可能与我使用rbenv但我团队的其他成员使用RVM的事实有关。

我一直试图弄清楚的是rbenv/RVM为特定Ruby创建的可执行文件是否相同。如果分别在.ruby_versionGemfile中明确指定了 Ruby 版本和 gem 版本,rbenvRVM是否有可能以不同的方式解释代码,或者我应该期望相同的结果?

更新。要求描述我遇到的实际错误,所以就在这里。

本质上,该项目正在使用dotenvgem(和dotenv-rails(来读取根目录中的.env文件。其中两个值(盐和 IV(是包含换行符的 Base64 编码字符串。在解码过程中的某个时刻,会在每个换行符之前添加一个额外的反斜杠,从而导致解密失败。问题是,dotenvgem 似乎正在正确读取文件(即在 Rails 控制台中运行Dotenv.load显示正确解析的字符串(,因此它是堆栈中更深层次的其他 gem 或扩展名导致了问题。我们还没有确定它。

我们的快速修复是gsub双重转义换行符(类似于这个foreman错误修复,但团队的一些成员不想合并它,因为他们确信这是由rbenv引起的环境问题。我认为情况并非如此,但我想知道在我尝试卸载rbenv并切换到RVM之前是否有可能,我真的不想这样做。

更新 #2。问题解决了!

我最终确实切换到RVM,但无济于事。然而,它最终确实是一个环境问题。

这是因为我的默认 shell 是zsh但我的团队大部分都使用bash,我们使用heroku local:run来启动本地开发环境。 事实证明,heroku local:run使用默认的 shell 环境。即使您从其他外壳(例如bash(进行调用。但是,默认情况下,rails consoleheroku local:run rails console都使用shzsh处理 env vars 的导入的方式与bashsh不同。

不,rvm 和 rbenv 编译的二进制文件并不相同,它们直接兼容。(例如,您不能使用 RVM 编译ruby,然后将其放入现有的 RBENV 设置中(提供给每个选项的编译选项不同,生成的文件的处理方式也不同。

也就是说,您应该考虑使用相同选项编译的相同版本的两个ruby二进制文件是二进制兼容的;也就是说,任何通过一个二进制文件运行的 Ruby 代码都应该以相同的方式运行另一个二进制文件,无论它们在哪个平台上编译,只要它们使用相同的选项和库进行编译。

例如,如果在没有OpenSSL支持的情况下编译rvm,则在尝试使用依赖于加密函数的库时,您将遇到无穷无尽的麻烦。同样,对于错误版本的阅读线也是如此。

您可以执行一个非常简单的实验来确定问题:在同一台计算机上编译ruby,并通过两个版本运行实验。

对于您概述的特定问题(dotenv 和额外的换行符(,请注意单引号和双引号字符串之间的区别,以及 Ruby 如何处理其中的控制字符。Ruby 仅解释双引号字符串中的转义序列,因此您可以通过确保值始终为单引号来解决问题。

最新更新