2017-07-24 100 views
0

我试图找出是否有可能我遇到的错误可能与我使用rbenv但我的团队的其余成员使用RVM这一事实有关。如果明确指定了项目的Ruby版本,是否可以从RVM更改为rbenv会引入错误?

我一直在想的是,对于特定的Ruby,由rbenv/RVM创建的可执行文件是否相同。如果分别在.ruby_versionGemfile中分别明确指定了Ruby版本和gem版本,那么rbenvRVM是否有可能会对代码进行不同解释或者我希望得到相同的结果?

UPDATE。我所遇到的实际错误的描述被要求,所以在这里。

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

我们速战速决是gsub的双重逃脱换行符(类似于this foreman bug fix,但球队的一些成员不希望因为他们相信这是造成rbenv的环境问题进行合并。我不认为这样的话,但我想知道如果这是一个可能性之前,我尝试卸载rbenv并切换到RVM,我真的不想做的事。

更新#2。问题解决了!

我没有结束切换到RVM,但无济于事。但最终确实成为一个环境问题。

这是因为我的默认外壳是zsh,但我的团队大部分使用bash,我们使用heroku local:run来启动本地开发环境。事实证明,它使用你的默认shell环境。即使您使用不同的外壳进行呼叫(例如bash)。然而,rails consoleheroku local:run rails console默认使用shzsh正在处理的env变量的输入与bashsh不同。

+0

可能是一样的......你为什么不说出你得到的错误是什么? –

+0

这有点复杂,我真正想要的是有人深入解释,如果RVM和rbenv具有不同的生成过程导致不同的可执行文件,或者在建立Ruby可执行文件时他们实际上做了同样的事情。但我给这个朋友发了一封电子邮件,他也想知道这个错误是什么,所以一旦我把它输入,我会更新我的问题。 –

回答

1

否,通过RVM和rbenv编译的二进制文件一样,他们是投递兼容。 (例如,您无法使用rvm编译ruby,然后将其放到现有的rbenv设置中)。提供给每个编译选项的编译选项不同,生成的文件处理方式不同。也就是说,您应该考虑两个ruby相同版本的二进制文件,它们使用相同的选项编译为二进制兼容的;也就是说,通过一个二进制文件运行的任何Ruby代码应该以相同的方式通过另一个二进制文件运行,而不管它们是在哪个平台上编译的,只要它们使用相同的选项和库编译为即可。

例如,如果rvm编译为without OpenSSL support,那么尝试使用依赖加密函数的库时将会遇到麻烦。同样,readline的版本很差。

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

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

相关问题