`gem install therubyracer` schlägt unter Mac OS X Lion fehl

70

Ich würde mich über Hilfe bei gem install therubyracerder Arbeit freuen . Hier ist der Fehler:

$ gem install therubyracer
Building native extensions.  This could take a while...
ERROR:  Error installing therubyracer:
    ERROR: Failed to build gem native extension.

        /Users/david/.rvm/rubies/ruby-1.9.3-p194/bin/ruby extconf.rb
checking for main() in -lobjc... yes
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of
necessary libraries and/or headers.  Check the mkmf.log file for more
details.  You may need configuration options.

Provided configuration options:
    --with-opt-dir
    --with-opt-include
    --without-opt-include=${opt-dir}/include
    --with-opt-lib
    --without-opt-lib=${opt-dir}/lib
    --with-make-prog
    --without-make-prog
    --srcdir=.
    --curdir
    --ruby=/Users/david/.rvm/rubies/ruby-1.9.3-p194/bin/ruby
    --with-objclib
    --without-objclib
extconf.rb:15:in `<main>': undefined method `include_path' for Libv8:Module (NoMethodError)

Hier sind einige bemerkenswerte Schritte, die ich vor dem Fehler ausgeführt habe. Sie haben gut funktioniert:

$ gem install libv8
$ brew install v8

Meine Umgebung ist:

  • Mac OS X Lion 10.7.4
  • ruby 1.9.3p194 (2012-04-20 revision 35410) [x86_64-darwin11.4.0] (via rvm)
  • V8 Version 3.9.24 (via Homebrew)
David J.
quelle
Hinweis: Ich hoffte, dass wellconsidered.be/post/18996655760/… von Nutzen sein würde, aber es half nicht.
David J.

Antworten:

106

Das hat bei mir funktioniert:

$ gem uninstall libv8
$ gem install therubyracer

(Ein großes Dankeschön an http://www.ruby-forum.com/topic/4306127 )

David J.
quelle
1
Ich bin auf Ruby 1.9.3p194 und das hat nicht funktioniert. "make: g ++ - 4.2: Keine solche Datei oder kein solches Verzeichnis"
jspooner
Ich habe versucht, jede Kombination der Edelsteine ​​zu installieren, aber nichts hat funktioniert. Am Ende habe ich nur das gemdir aus dem Verzeichnis ruby1.9.2p125 in das neue Verzeichnis p194 kopiert.
Jspooner
@jspooner Dies ist für viele Leute ein relativ kniffliger Installationsprozess. Wenn Sie Lust dazu haben, stellen Sie eine Frage wie ich, mit Ihren Konfigurationseinstellungen im Detail, was Sie versucht haben und so weiter.
David J.
:( hat bei mir nicht funktioniert, das bekomme ich: FEHLER: Fehler beim Installieren des Theryracers: FEHLER: Fehler beim Erstellen der nativen Gem-Erweiterung. /Users/lionel_lei/.rvm/rubies/ruby-1.9.3-p194/bin/ ruby extconf.rb nach main () in -lobjc suchen ... ja Makefile erstellen make kompilieren rr.cpp make: clang ++: Keine solche Datei oder kein solches Verzeichnis make: *** [rr.o] Fehler 1
lionel
1
@lionel Kannst du einen Überblick über genau das geben, was du versucht hast? Haben Sie versucht, eine neue rbenvoder eine neue rvmInstallation einzurichten und die Schritte (in einer Übersicht) aufzuschreiben, um das Problem einzugrenzen? Hast du brew install v8zuerst gemacht?
David J.
43
gem uninstall libv8
brew install v8
gem install therubyracer
Ken Mazaika
quelle
Danke Ken. Die Installation dauerte ca. 3-5 Minuten. Alles, was mit therubyracer-0.11.2 funktioniert, das libv8-3.11.8.13 automatisch installiert hat.
Scarver2
Vielen Dank! Arbeitete wie ein Zauber für mich.
Dmytro Uhnichenko
40

Aber warum passiert das, fragst du? Und warum behebt die Deinstallation libv8und Neuinstallation therubyracerdas Problem?

Die Antwort befindet sich am Ende der Fehlermeldung (vom ursprünglichen Beitrag). Ignoriere das Zeug

probably lack of necessary libraries and/or headers

Dies ist eine falsche Annahme von demjenigen, der diese Fehlermeldung geschrieben hat. Unten sehen Sie, was Ruby dazu zu sagen hat:

undefined method `include_path' for Libv8:Module

In meinem Fall habe ich versucht, therubyracer-0.9.8mit zu installieren bundle install, und aus irgendeinem Grund habe ich versucht, meine Kopie von libv8-3.11.8.13, die irgendwann installiert worden war, wahrscheinlich als Abhängigkeit von einem anderen Juwel zu verwenden.

Ich weiß nicht, warum es versucht hat, die neuere Version zu verwenden, weil therubyracer.gemspecenthält s.add_dependency "libv8", "~> 3.3.10". Und mein Gemfile.locksagt zu verwenden libv8 (3.3.10.2). Aber leider geschah genau das.

Und es ist wahr , dass Libv8:Modulesie nicht die Methode hat include_pathin libv8-3.11.8.13, aber es tut inlibv8-3.3.10.2

Aus diesem Grund funktioniert die Deinstallation aller Versionen von libv8und die anschließende Neuinstallation therubyracer. Da alle Fassungen , libv8dass nicht über das Verfahren include_pathvollständig entfernt werden, und die , libv8das hat die Methode includePfad neu installiert wird , wenn Sie neu installieren therubyracer.

Mars Redwyne
quelle
2
Vielen Dank, dass Sie sich die Zeit genommen haben, die Erklärung zu schreiben, warum dies funktioniert
Konzept47
Was ist, wenn ich die neuere Version von libv8 nicht löschen möchte, falls andere Projekte davon abhängen? Was mache ich dann?
Magne
Fand es! Überprüft, ob ich Gemfilekeine spezielle Therubyracer-Version benötige. Dann habe ich die alte Gemfile.lockVersion gelöscht, in der eine alte Therubyracer-Version angegeben war, für die wiederum die alte libv8Version erforderlich war . (Jemand muss es zuvor für das Projekt festgeschrieben haben, und dann hat die Bundle-Installation versucht, es bei der Installation zu verwenden.) Als ich es bundle installerneut ausführte, wurde ein neues Gemfile.lockmit neuen Verbindungen erstellt und die neueste therubyracerVersion mit der neuesten libv8Version verbunden, kein Problem.
Magne
15

Da dies nicht zu 100% für mich funktioniert hat, dachte ich, ich würde posten, was getan wurde (als Teil eines Rails-Projekts):

gem uninstall libv8
bundle update therubyracer

Dies stellte sicher, dass ich die neueste therubyracerund auch eine neuere Version von libV8bekam und die zahlreichen Probleme, die ich hatte, von fehlenden libv8.a-Dateien bis hin zu undefinierten Methoden, zu beheben schien.

Abe Petrillo
quelle
es war das einzige, das mir auf osx 10.9.1 (Maverick) geholfen hat
Artur79
Können Sie bitte erklären, warum ich diesen Befehl jedes Mal ausführen muss, wenn ich eine bestimmte Anwendung bereitstellen muss? Ich benutze einen Mac.
Som Poddar
Sollte es nicht mehr als einmal ausgeführt werden müssen? es sei denn, Sie haben mehrere Versionen von beiden Edelsteinen und machen etwas Seltsames mit Gemfile.lock?
Abe Petrillo
Dies hat es für mich getan, Rails 4, Mac OS 10.9.4. Vielen Dank für die Hilfe an alle.
David Routen
12

Zuletzt benutze ich Therubyracer 0.11.0beta5 als Lösung.

Verwendung des Therubyracers (0.11.0beta5)

füge folgendes auf Gemfile hinzu

gem 'therubyracer', '~> 0.11.0beta5'
group :libv8 do
  gem 'libv8', "~> 3.11.8"
end

dann bundle install

Mac OSX 10.8 Moutain Lion

szpapas
quelle
1
Ich habe dies versucht, aber: Gem :: Installer :: ExtensionBuildError: FEHLER: Fehler beim Erstellen der nativen Gem-Erweiterung. /Users/lionel_lei/.rvm/rubies/ruby-1.9.3-p194/bin/ruby extconf.rb nach main () in -lpthread suchen ... ja nach main () in -lobjc suchen ... ja Makefile erstellen make compiling accessor.cc make: clang ++: Keine solche Datei oder kein solches Verzeichnis make: *** [accessor.o] Fehler 1 Ich bin auf Rails 3.2.6, Ruby 1.9.3p194 (2012-04-20 Revision 35410) [x86_64- darwin11.4.1], osx 10.7.4
lionel
10

Wenn Sie es brauchen 0.11.3und es fehlschlägt, probieren Sie es für Mac OS X 10.9 aus ...

gem uninstall libv8
brew install v8
gem install libv8 -- --with-system-v8
gem install therubyracer -v '0.11.3' -- --with-system-v8

Siehe dieses ProblemWeitere Informationen finden .

Sie brauchen das wahrscheinlich nicht -- --with-system-v8in der letzten Zeile, aber ich habe es nur aus Sicherheitsgründen getan, da ich gesehen habe, wie es angefangen hat, Fetching: libv8-3.11.8.17-x86_64-darwin-13.gem (1%)als ich den Befehl ausgeführt habe ...

Jedenfalls hat es bei mir funktioniert, als all die anderen Dinge nicht funktionierten.

cwd
quelle
Dies funktionierte auch für mich, die --mit-System-v8 war in der letzten Zeile obligatorisch
IanBussieres
7

Für alle, die unter Mac OSX 10.8 Mountain Lion auf dieses Problem stoßen, wenn sie versuchen, ihre Gem-Datei mit zu aktualisieren, funktioniertegem 'therubyracer', '0.11.0' nur das Upgrade des System- Gemslibv8 für mich (keine Deinstallation eines anderen Gems erforderlich):

$ gem update libv8
$ bundle install

Bearbeiten

Wenn Sie Travis-CI (oder andere CI-Tools auf anderen Servern, nehme ich an) verwenden, müssen Sie libv8das Gem explizit zu Ihrer Gemfile hinzufügen :

Gemfile

gem 'libv8', '3.11.8.3'

dann bundle installwie gewohnt. Beachten Sie nur, dass libv8die Installation viel Zeit in Anspruch nehmen kann, und ich habe festgestellt, dass dies möglicherweise dazu führt, dass die Zeitlimits von Travis CI überschritten werden und Ihr Build fehlschlägt. Sie können dies leicht abmildern, indem Sie Edelsteine ​​der Entwicklungsumgebung nicht in Ihre Builds einbeziehen:

.travis.yml

# ...
bundler_args: --binstubs=./bundler_stubs --without development

Aktualisieren

Ja, so ziemlich alle meine Travis bauen Timeout und scheitern daran. Wenn jemand einen Weg kennt, um dieses Problem zu lösen (ich würde hoffen, dass "Downgrade therubyracer" das letzte Mittel ist), hinterlassen Sie bitte einen Kommentar!

Update 2

Dies funktioniert möglicherweise nicht für alle Apps, aber es scheint, dass meine Rails 3.2.9-Apps nicht wirklich therubyraceroder doch nicht benötigt wurden libv8. Nachdem ich diese Edelsteine ​​aus meiner Gemfile entfernt habe ich , bestätigte ich, dass meine Spezifikationen bestanden wurden, schob sie erneut an Travis und sie wurden erfolgreich erstellt. Ich denke, diese Edelsteine ​​loszuwerden (wenn Sie nicht sicher sind, ob Sie sie tatsächlich brauchen) ist zumindest einen Versuch wert.

Update 3

Vielen Dank an Paul Annesley für die Bestätigung, dass Sie unter Mac OS X 10.8 Mountain Lion überhaupt kein therubyracerJuwel benötigen, da das Betriebssystem bereits mit Apple JavaScriptCore, seinem eigenen Javascript-Runner, geliefert wird. Zum Zeitpunkt der ursprünglichen Antwort war ich auf Snow Leopard und brauchte es daher.

Paul Fioravanti
quelle
In Bezug auf "Update 2" und nicht erforderlich therubyraceroder libv8vermutlich bedeutet dies, dass Sie entweder kein CoffeeScript oder einen alternativen JS-Runner verwenden.
Paul Annesley
Ich benutze auf jeden Fall Coffeescript. Wenn ich zurückblicke, glaube ich, dass ich diese Änderung kurz nach dem Upgrade von OS X von Snow Leopard auf Mountain Lion vorgenommen habe. Vielleicht hat Mountain Lion also einen eigenen JS-Runner, der therubyracerunnötig gemacht hat ...?
Paul Fioravanti
1
Ah ja; "Apple JavaScriptCore - In Mac OS X enthalten" wird als eine der Laufzeiten auf github.com/sstephenson/execjs/blob/master/README.md
Paul Annesley am
Vielen Dank für die Bestätigung. Ich habe es der Antwort hinzugefügt.
Paul Fioravanti
Aus irgendeinem Grund muss ich diesen Befehl jedes Mal ausführen, wenn ich eine Anwendung lokal ausführe. Kann jemand erklären, warum ich es jedes Mal ausführen muss, anstatt einmal.
Som Poddar
4

Für mich bundle installwar es magisch , die Gemfile.lock-Datei zu entfernen und auszuführen .

Alex Weber
quelle
1
Beachten Sie, dass das Ausführen bundle updatepraktisch dasselbe ist wie das Löschen Gemfile.lockund Ausführen bundle install.
GMA
3

OSX 10.8.2, Ruby 1.9.3p125

Keiner der oben genannten Punkte hat bei mir funktioniert ... Ich hatte es satt zu versuchen, das richtige Juwel für meine Umgebung zu finden, also habe ich nur eine weiche Verknüpfung mit dem g ++ - Ziel hergestellt, bei dem diese Dinge fehlten:

sudo ln -s `which g++` /usr/bin/g++-4.2

Nicht so hilfreich für Remote-Bereitstellungen, aber erledigen Sie die Arbeit auf meiner Workstation.

Colby Blair
quelle
1

Ich habe ein ähnliches Problem, aber es hat sich auch darüber beschwert, dass ich g ++ - 4.2 nicht gefunden habe. Ich hatte XCode-Befehlszeilentools installiert, aber es suchte nach /usr/bin/g++-4.2, ich hatte g ++ (ein symbolischer Link, der auf llvm-g ++ - 4.2 verweist). Wie auch immer, ich habe gerade einen symbolischen Link zu g ++ erstellt und die Bundle-Installation erneut versucht ... es hat funktioniert!

$ cd /usr/bin

$ sudo ln -s g++ g++-4.2

richardun
quelle
0

Hatte den gleichen Fehler, das hat bei mir funktioniert:

  1. Von der Konsole: gem uninstall libv8

  2. Fügen Sie in Ihrer Gemfile Folgendes hinzu:

    gem 'therubyracer', :platforms => :ruby, :require => 'v8'
    gem 'libv8', '~> 3.11.8'  # Update version number as needed
    
  3. Von der Konsole: bundle install

Wenn Sie gerade dabei waren, den Edelsteinraub zu verbessern, möchten Sie vielleicht rennen bundle update therubyracer . (Geben Sie eine Versionsnummer an.)

Dies war auf Mac 10.6 (Snow Leopard).

michaeldwp
quelle