2017-07-24 23 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僅用雙引號字符串解釋轉義序列,因此您可以通過確保您的值總是單引號來解決您的問題。

相關問題