如果明确指定项目的 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_version
和 Gemfile
中明确指定,是否有可能 rbenv
和 RVM
解释代码不同还是我应该期待相同的结果?
更新。要求对我遇到的实际错误进行描述,所以在这里。
本质上,该项目正在使用 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 console
和 heroku local:run rails console
默认都使用 sh
。 zsh
处理环境变量导入的方式不同于 bash
和 sh
.
不,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 仅解释双引号字符串中的转义序列,因此您可以通过确保您的值始终是单引号来解决您的问题。
我想弄清楚我遇到的错误是否可能与我使用 rbenv
但我团队的其他人使用 RVM
这一事实有关。
我一直想弄清楚的是 rbenv
/RVM
为特定 Ruby 创建的可执行文件是否相同。如果 Ruby 版本和 gem 版本分别在 .ruby_version
和 Gemfile
中明确指定,是否有可能 rbenv
和 RVM
解释代码不同还是我应该期待相同的结果?
更新。要求对我遇到的实际错误进行描述,所以在这里。
本质上,该项目正在使用 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 console
和 heroku local:run rails console
默认都使用 sh
。 zsh
处理环境变量导入的方式不同于 bash
和 sh
.
不,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 仅解释双引号字符串中的转义序列,因此您可以通过确保您的值始终是单引号来解决您的问题。