2016-05-15 142 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