Restclient投掷异常异常

时间:2016-05-15 05:59:45

标签: ruby ffi rest-client

尝试使用以下宝石时:

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会怎么样?所以我安装了运行ffi所需的restclient版本但是,这也没有帮助。

  • 更新了我的所有宝石,但仍然犯了同样的错误..

  • ffi上下载了最新版本,没有任何变化,但现在我的系统上有ffi的新版本,与{一起使用时仍然出错{1}}

为什么restclient会产生restclient错误,我之前从未发生过这种情况。 ffi已被弃用吗?还是有一个我没有抓住的简单解决方案?我已经对此进行了研究,没有人遇到过这个问题(使用rest-client时)但是有很多人在使用其他宝石时遇到了这个错误。例如,另见here。值得一提的是,我正在运行Windows 7。

2 个答案:

答案 0 :(得分: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',但也失败了。现在的问题是第一部分不应该失败。

在您的情况下,您似乎正在使用为另一个版本的Ruby编译的FFI gem。不幸的是,ruby在发布期间改变了它的ABI,所以这不起作用。

因此,您需要确保使用与您的ruby版本匹配的预编译gem(可能很难找到)或自己编译。为此,请为您的Ruby版本安装Development Kit(位于页面左下角)。然后,您可以安装ffi gem并强制它在安装时编译C扩展:

gem install ffi --platform=ruby

这是必需的gem install ffi(没有--platform参数),rubygems首先尝试安装特定于您的平台的gem变体,即您的情况下的mingw32,可从预编译中获得来自rubygems.org。不幸的是,这个预编译的gem显然与您的Ruby版本不兼容。因此,您可以强制rubygems获取gem的源版本并自行编译C扩展。这就是你指示rubygems处理--platform=ruby参数的原因。

这与FFI的问题跟踪器上的描述in the issues相符。

答案 1 :(得分:0)

所以我找到了答案,这与Holger Just的答案有关,只需稍作调整,我非常确定我的案例非常独特,因为我的公司喜欢躲在VPN脚本后面。所以这就是我如何做到的:

  • 首先,我需要使用平台标志ffi
  • 安装gem install ffi --pre --platform=ruby的预发行版gem。
  • 接下来我必须更新gem:gem update --all(我认为这是该标志的正确语法)

ffi工作了。