2012-03-15 52 views
1

很多時候,使用RVM('最受歡迎的安裝Ruby工具')安裝的Ruby會生成一個不支持SSL操作的二進制文件(如通過HTTPS連接)。這是known workaround的已知問題。在運行時檢測ruby二進制編譯佈局

如果您嘗試在這種Ruby二進制文件中使用SSL,則會導致異常LoadError: cannot load such file -- openssl

問題:有什麼辦法,我可以告訴這些庫的Ruby二進制文件在運行時內置反對,從而檢測它是否能夠SSL與否?除了嘗試實際使用SSL並捕獲異常?

回答

4

除非您想做同樣的工作,否則我認爲最簡單的方法是嘗試要求openssl並在系統上不存在檢測其可用性的情況下挽救LoadError。

這似乎是一個成語commonly使用。

如果你想要的東西,檢測是否加載或者事後沒有將

ruby -ropenssl -e 'p defined? OpenSSL' # => "constant" 

ruby -e 'p defined? OpenSSL' # => nil 

幫你?

也就是說,檢查返回值defined?(OpenSSL)是否爲非零?

我們通常使用這tests在運行時,其中不可用OpenSSL的所有版本的功能是用來排除測試,完全(if defined? OpenSSL)排除測試如果OpenSSL是不存在作爲一個擴展。

+0

這將使我從我的ruby代碼開始一個單獨的過程,但它仍然可能比依靠異常更好,將接受如果沒有其他答案 – 2012-03-15 14:05:40

+0

對不起,混亂,不,你當然可以使用'defined? OpenSSL'直接在你的代碼中,不需要把它分成一個單獨的進程 - 我只是用它作爲例子,因爲你可以方便地將它輸入到你的終端。如果你看一下鏈接測試,就是這樣看起來像內聯。 – emboss 2012-03-15 14:36:39

+0

我還是不太明白。所以我有兩個紅寶石二進制文件 - 有和沒有SSL支持。我正在創建一個單行程序'p defined? OpenSSL'和這兩個紅寶石產生相同的結果B/C它沒有被定義,直到你需要'openssl'...當我要求沒有SSL支持的那個提供了一個例外 – 2012-03-15 14:55:14

相關問題