2016-05-15 136 views
0

在嘗試使用下面的寶石:RESTClient實現拋出異常異常

require 'nokogiri' 
require 'restclient' 
require 'mechanize' 

,我發現了以下錯誤:

C:/Ruby23/lib/ruby/site_ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:in `require': cannot load such file -- ffi_c (LoadError) 
     from C:/Ruby23/lib/ruby/site_ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:in `require' 
     from C:/Ruby23/lib/ruby/gems/2.3.0/gems/ffi-1.9.10-x86-mingw32/lib/ffi.rb:6:in `rescue in <top (required)>' 
     from C:/Ruby23/lib/ruby/gems/2.3.0/gems/ffi-1.9.10-x86-mingw32/lib/ffi.rb:3:in `<top (required)>' 
     from C:/Ruby23/lib/ruby/site_ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:in `require' 
     from C:/Ruby23/lib/ruby/site_ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:in `require' 
     from C:/Ruby23/lib/ruby/gems/2.3.0/gems/rest-client-1.8.0-x86-mingw32/lib/restclient/windows/root_certs.rb:2:in `<top (required)>' 
     from C:/Ruby23/lib/ruby/gems/2.3.0/gems/rest-client-1.8.0-x86-mingw32/lib/restclient/windows.rb:7:in `require_relative' 
     from C:/Ruby23/lib/ruby/gems/2.3.0/gems/rest-client-1.8.0-x86-mingw32/lib/restclient/windows.rb:7:in `<top (required)>' 
     from C:/Ruby23/lib/ruby/site_ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:in `require' 
     from C:/Ruby23/lib/ruby/site_ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:in `require' 
     from C:/Ruby23/lib/ruby/gems/2.3.0/gems/rest-client-1.8.0-x86-mingw32/lib/restclient.rb:16:in `<top (required)>' 
     from C:/Ruby23/lib/ruby/site_ruby/2.3.0/rubygems/core_ext/kernel_require.rb:133:in `require' 
     from C:/Ruby23/lib/ruby/site_ruby/2.3.0/rubygems/core_ext/kernel_require.rb:133:in `rescue in require' 
     from C:/Ruby23/lib/ruby/site_ruby/2.3.0/rubygems/core_ext/kernel_require.rb:40:in `require' 
     from parse_docs.rb:5:in `<main>' 

由於這個名單上的最後一件事是5號線,這是require 'restclient'我猜它與此有關?不過,我已經嘗試做到以下幾點:

  • 由於restclient已被棄用,並已轉移到rest-client,我嘗試使用rest-client但不工作,併產生同樣的錯誤。

  • 我也試圖require 'rubygems',但是當我運行該程序時,它不會允許我繼續併產生相同的錯誤。

  • 所以我完全拿掉了restclient,這就是我如何得到restclient導致問題的想法,因爲如果沒有它,程序可以成功運行。

  • 所以我雖然會發生什麼,如果我回滾ffi?所以我安裝了運行restclient所需的ffi版本。但是,這也沒有幫助。

  • 更新了我所有的寶石,還拋出了同樣的錯誤..

  • 下載上ffi最新版本,沒有什麼變化,但現在我在我的系統上havea的ffi新版本,這仍然拋出一個錯誤時正在與restclient

爲什麼restclient生產ffi錯誤使用,我以前從來沒有這種事發生在我身上。 rest-client已棄用?還是有一個簡單的解決方案,我不趕上?我研究過這個,沒有人有這個問題(使用restclient時),但是有很多人在使用其他寶石時得到這個錯誤。例如,另請參閱here。也許值得一提的是,我正在運行Windows 7.

+0

有沒有人知道這些信息? – 13aal

+0

如果可以,請嘗試使用ruby 2.2。目前,ruby 2.3似乎是[不支持的](https://github.com/ffi/ffi/issues/500)。 – rdupz

回答

0

所以我找到了一個答案,它與Holger Just的答案做了一個小小的調整,我很確定我的情況非常獨特,因爲我的公司喜歡隱藏在VPN腳本後面。因此,這裏是我是如何做的:

  • 首先,我需要使用平臺標誌安裝的ffi預發佈寶石:gem install ffi --pre --platform=ruby
  • 接下來,我不得不更新寶石:gem update --all(我認爲這是正確的語法爲國旗)

得到了ffi工作。

+1

這很奇怪......'--pre'標誌是不用於選擇以前的版本,但是要安裝預發佈的gem(如果有的話)因此'gem install ffi --pre'應該安裝與當前沒有標誌的安裝完全相同的gem。我能想到的唯一的事情就是你有代理或者緩存提供了不同於rubygems.org的寶石,並且你的命令設法繞過了這些(過時的)緩存。 –

+0

這很有趣.. – 13aal

2

錯誤發生在ffi試圖加載其C擴展後。如果我們看一下the source code of the FFI gem,它試圖根據Ruby的版本目前運行加載編譯擴展:

begin 
    require RUBY_VERSION.split('.')[0, 2].join('.') + '/ffi_c' 
rescue Exception 
    require 'ffi_c' 
end 

第一部分失敗,所以它回落到require 'ffi_c'這也將失敗。現在的問題是,第一部分不應該失敗。

在你的情況,似乎你正在使用一個FFI寶石,這是爲另一個版本的Ruby編譯的。不幸的是,ruby在發佈過程中改變了它的ABI,所以這是行不通的。因此,您需要確保您使用的是與您的ruby版本相匹配的預編譯的gem(可能很難找到)或者自己編譯它。爲此,請爲您的Ruby版本安裝Development Kit(朝向頁面的左下角)。然後,您可以安裝FFI的寶石,並迫使它來編譯上安裝了C的擴展:

gem install ffi --platform=ruby 

這是必須的gem install ffi(不--platform參數),RubyGems的首先嚐試特定的寶石變種安裝到您的平臺,即你的情況下的mingw32,它可以從rubygems.org預編譯。不幸的是,這個預編譯好的gem顯然與您的Ruby版本不兼容。因此,您可以強制rubygems獲取gem的源代碼版本,並自行編譯C擴展。這就是你指示rubygems與--platform=ruby的論點。

這與FFI問題追蹤器上的描述in the issues相匹配。

+0

我已經安裝了開發工具包。你確定運行平臺安裝會有幫助嗎? – 13aal

+0

儘管如此,Ruby首先會嘗試安裝與您的平臺相匹配的(預編譯)gem,但在您的情況下不起作用。如果你用'--platform = ruby​​'安裝了gem,那麼擴展就會被編譯爲你當前的ruby版本,並且可能不會再出現這個問題。 –

+0

這並不能解釋爲什麼當我安裝最新版本時,它做了同樣的事情,我也回滾了,等等,這沒有幫助..? – 13aal