Restclient 抛出异常
Restclient throwing unusual exception
尝试使用以下 gem 时:
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
上下载了最新版本,没有任何变化,除了现在我的系统上有一个新版本的ffi
,与[一起使用时仍然抛出错误=13=]
为什么 restclient
会产生 ffi
错误,我以前从未遇到过这种情况。 rest-client
是否已弃用?还是有一个我没有抓住的简单解决方案?我对此进行了研究,没有人遇到过这个问题(在使用 restclient
时),但是有很多人在使用其他 gem 时遇到过这个错误。例如,另请参见 here。可能还值得一提的是,我 运行ning Windows 7.
在 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 gem,它是为另一个版本的 Ruby 编译的。不幸的是,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 相符。
所以我找到了这个问题的答案,它与 Holger Just 的答案有一点小调整,我很确定我的案例非常独特,因为我的公司喜欢隐藏在 VPN 脚本后面。所以我是这样做的:
- 首先,我需要使用平台标志安装
ffi
的预发布版 gem:gem install ffi --pre --platform=ruby
- 接下来我必须更新 gem:
gem update --all
(我认为这是标志的正确语法)
ffi
成功了。
尝试使用以下 gem 时:
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
上下载了最新版本,没有任何变化,除了现在我的系统上有一个新版本的ffi
,与[一起使用时仍然抛出错误=13=]
为什么 restclient
会产生 ffi
错误,我以前从未遇到过这种情况。 rest-client
是否已弃用?还是有一个我没有抓住的简单解决方案?我对此进行了研究,没有人遇到过这个问题(在使用 restclient
时),但是有很多人在使用其他 gem 时遇到过这个错误。例如,另请参见 here。可能还值得一提的是,我 运行ning Windows 7.
在 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 gem,它是为另一个版本的 Ruby 编译的。不幸的是,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 相符。
所以我找到了这个问题的答案,它与 Holger Just 的答案有一点小调整,我很确定我的案例非常独特,因为我的公司喜欢隐藏在 VPN 脚本后面。所以我是这样做的:
- 首先,我需要使用平台标志安装
ffi
的预发布版 gem:gem install ffi --pre --platform=ruby
- 接下来我必须更新 gem:
gem update --all
(我认为这是标志的正确语法)
ffi
成功了。