2016-05-15 12 views
0

Bei dem Versuch, die folgenden Edelsteine ​​zu verwenden:Restclient wirft ungewöhnliche Ausnahme

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

ich die folgende Fehlermeldung erhalten:

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>' 

Da das letzte, was auf dieser Liste Linie 5 ist, das ist require 'restclient' Ich vermute es hat etwas damit zu tun? Allerdings habe ich versucht, die folgendes zu tun:

  • Seit restclient ist veraltet und bewegt hat rest-client, versuchte ich rest-client jedoch mit, das nicht funktioniert und produziert den gleichen Fehler.

  • Ich habe auch versucht, require 'rubygems', aber wenn ich das Programm ausführen, wird es mir nicht erlauben, fortzufahren und produziert den gleichen Fehler.

  • So habe ich komplett restclient herausgenommen, das ist, wie ich die Idee bekam, dass restclient das Problem verursacht, denn ohne es dort kann das Programm erfolgreich ausgeführt werden.

  • Also was würde passieren, wenn ich auf ffi zurückrollen würde? Also habe ich die ffi Version installiert, die benötigt wird, um restclient zu laufen. Das hat aber auch nicht geholfen.

  • aktualisiert alle meine Edelsteine, noch den gleichen Fehler zu werfen ..

  • die neueste Version auf ffi, heruntergeladen außer jetzt nichts ändert, havea ich eine neue Version von ffi auf meinem System, dass immer noch ein Fehler vorliegt werfen, wenn mit restclient

Warum benutzt wird restclient Herstellung des ffi Fehler habe ich noch nie ist mir das passiert vor. Ist rest-client veraltet? Oder gibt es eine einfache Lösung, an die ich mich nicht halte? Ich habe das erforscht, und niemand hat dieses Problem gehabt (während restclient), aber es gibt eine Menge Leute, die diesen Fehler bekommen haben, während sie andere Edelsteine ​​benutzen. Siehe zum Beispiel auch here. Es kann auch erwähnenswert sein, dass ich Windows 7 ausführen.

+0

Weiß jemand etwas über diese Information? – 13aal

+0

Versuchen Sie mit Ruby 2.2, wenn Sie können. Ruby 2.3 scheint im Moment [nicht unterstützt] (https://github.com/ffi/ffi/issues/500) zu sein. – rdupz

Antwort

0

So fand ich eine Antwort darauf, es hatte mit Holger Just 'Antwort zu tun, mit einem kleinen Tweak, ich bin ziemlich sicher, dass mein Fall ziemlich einzigartig ist, weil sich meine Firma hinter einem VPN-Skript versteckt. Also hier ist, wie ich es tat:

  • Zuerst musste ich das Pre-Release-Juwel von ffi mit dem Plattform-Flag installieren: gem install ffi --pre --platform=ruby
  • Next ich das Juwel aktualisieren musste: gem update --all (ich glaube, das ist die richtige Syntax für die Flagge)

Das hat ffi funktioniert.

+1

Das ist seltsam ... Die' --pre' Flagge ist nicht verwendet, um die vorherige Version auszuwählen, sondern Pre-Release-Edelsteine ​​(falls vorhanden) zu installieren. Daher sollte 'Gem install ffi --pre' genau das gleiche Juwel installieren, das ohne das Flag installiert wäre. Das Einzige, woran ich hier denken kann, ist, dass Sie Proxies oder Caches haben, die andere Edelsteine ​​als die von rubygems.org zur Verfügung stellen, und Ihre Befehle haben es irgendwie geschafft, diese (veralteten) Caches zu umgehen. –

+0

Das ist interessant .. – 13aal

2

Der Fehler tritt auf, nachdem die ffi versucht, seine C-Erweiterung zu laden. Wenn wir einen Blick auf the source code of the FFI gem haben, versucht es, die compiliert Erweiterung zu laden nach der Version von Ruby derzeit ausgeführt wird:

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

Der erste Teil nicht so fällt es zurück in die require 'ffi_c' die ebenfalls ausfällt. Das Problem ist jetzt, dass der erste Teil nicht fehlschlagen sollte.

In Ihrem Fall scheint es, dass Sie ein FFI-Juwel verwenden, das für eine andere Version von Ruby kompiliert wurde. Leider hat Ruby seinen ABI während Releases geändert, so dass dies nicht funktioniert.

Daher müssen Sie sicherstellen, dass Sie entweder den vorkompilierten Edelstein verwenden, der zu Ihrer Ruby-Version passt (die möglicherweise schwer zu finden ist), oder sie selbst kompilieren. Installieren Sie dazu die Development Kit für Ihre Ruby-Version (unten links auf der Seite).Dann können Sie das ffi Juwel installieren und es zwingen, die C-Erweiterung bei der Installation zu kompilieren:

gem install ffi --platform=ruby 

Dies ist erforderlich, da gem install ffi (ohne die --platform Parameter), versucht rubygems zuerst die Edelstein-Variante speziell auf Ihre Installation Plattform, dh mingw32 in Ihrem Fall, die in vorkompiliert von von rubygems.org verfügbar ist. Leider ist dieses vorkompilierte Juwel anscheinend nicht mit Ihrer Ruby-Version kompatibel. Als solches können Sie Rubygems erzwingen, um die Quellversion des Edelsteins zu erhalten und die C-Erweiterung selbst zu kompilieren. Dies ist, was Sie rubygems mit dem Argument --platform=ruby anweisen.

Dies entspricht der Beschreibung in the issues auf FFI Problem Tracker.

+0

Ich habe bereits das dev kit installiert. Sind Sie sicher, dass das Ausführen einer Plattform-Installation helfen wird? – 13aal

+0

Trotzdem versucht Ruby zuerst, das (vorkompilierte) Juwel zu installieren, das zu Ihrer Plattform passt, was in Ihrem Fall nicht funktioniert. Wenn Sie das Juwel mit '--platform = ruby' installieren, wird die Erweiterung für Ihre aktuelle Ruby-Version kompiliert und wird das Problem wahrscheinlich nicht mehr zeigen. –

+0

Das erklärt nicht wirklich warum, als ich die neueste Version installierte, tat es dasselbe, ich rollte auch zurück usw., und das hat nicht geholfen ..? – 13aal