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

If a project's Ruby version is explicitly specified, could changing from RVM to rbenv introduce bugs?

我想弄清楚我遇到的错误是否可能与我使用 rbenv 但我团队的其他人使用 RVM 这一事实有关。

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

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

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

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

更新#2。问题已解决!

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

这是因为我的默认 shell 是 zsh,但我的大部分团队使用 bash,并且我们使用 heroku local:run 来启动本地开发环境。结果 heroku local:run 使用默认的 shell 环境。即使您从不同的 shell(例如 bash)拨打电话。然而,rails consoleheroku local:run rails console 默认都使用 shzsh 处理环境变量导入的方式不同于 bashsh.

不,rvm 和 rbenv 编译的二进制文件 not 相同,并且它们 not drop-in compatible。 (例如,您不能用 rvm 编译 ruby 然后将其放入现有的 rbenv 设置中)提供给每个人的编译选项不同,生成的文件处理方式也不同。

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

例如,如果编译了 rvm without OpenSSL support you will have no end of trouble when trying to use libraries that rely on cryptographic functions. Likewise with bad versions of readline

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

对于您列出的具体问题(dotenv 和额外的换行符),请注意 the difference between single quoted and double quoted strings,以及 Ruby 如何处理其中的控制字符。 Ruby 仅解释双引号字符串中的转义序列,因此您可以通过确保您的值始终是单引号来解决您的问题。