`gem install therubyracer` échoue sur Mac OS X Lion

J’apprécierais de l’aide pour que gem install therubyracer fonctionne. Voici l’erreur:

 $ 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 `': undefined method `include_path' for Libv8:Module (NoMethodError) 

Voici quelques étapes notables que j’ai courues avant l’erreur. Ils ont bien travaillé:

 $ gem install libv8 $ brew install v8 

Mon environnement est:

  • Mac OS X Lion 10.7.4
  • ruby 1.9.3p194 (2012-04-20 révision 35410) [x86_64-darwin11.4.0] (via rvm)
  • V8 version 3.9.24 (via homebrew)

Cela a fonctionné pour moi:

 $ gem uninstall libv8 $ gem install therubyracer 

(Un grand merci à http://www.ruby-forum.com/topic/4306127 )

 gem uninstall libv8 brew install v8 gem install therubyracer 

Mais pourquoi cela se passe-t-il? Et pourquoi la désinstallation de libv8 et la réinstallation de therubyracer le problème?

La réponse se trouve au bas du message d’erreur (d’orig post). Ignorer les choses sur

 probably lack of necessary libraries and/or headers 

Ceci est une hypothèse incorrecte par quiconque a écrit ce message d’erreur. En bas, vous voyez ce que Ruby a à dire à ce sujet:

 undefined method `include_path' for Libv8:Module 

Dans mon cas, j’essayais d’installer therubyracer-0.9.8 avec une bundle install , et pour une raison quelconque, il essayait d’utiliser ma copie de libv8-3.11.8.13 , qui avait été installée à un moment donné, probablement comme une dépendance de un autre bijou.

Je ne sais pas pourquoi il essayait d’utiliser la nouvelle version, parce que therubyracer.gemspec contient s.add_dependency "libv8", "~> 3.3.10" . Et mon Gemfile.lock dit d’utiliser libv8 (3.3.10.2) . Mais hélas, c’est bien ce qui se passait.

Et il est vrai que Libv8:Module n’a pas la méthode include_path dans libv8-3.11.8.13 , mais c’est le cas dans libv8-3.3.10.2

C’est pourquoi la désinstallation de toutes vos versions de libv8 et la réinstallation de therubyracer fonctionnent. Parce que toutes les versions de libv8 qui n’ont pas la méthode include_path sont complètement supprimées et que la libv8 qui a la méthode include path est réinstallée lorsque vous réinstallez therubyracer .

En l’absence de tout ce qui a fonctionné pour moi à 100%, j’ai pensé que je posterais ce qui a fait (dans le cadre d’un projet de rails):

 gem uninstall libv8 bundle update therubyracer 

Cela m’a permis d’obtenir le dernier therubyracer , ainsi qu’une version plus récente de libV8 , et semble corriger les multiples problèmes que je rencontrais, des fichiers manquants libv8.a aux méthodes non définies.

Enfin, j’utilise therubyracer 0.11.0beta5 comme solution.

Utilisation de therubyracer (0.11.0beta5)

append les informations suivantes sur Gemfile

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

puis bundle install

Mac OSX 10.8 Moutain Lion

Si vous avez besoin de 0.11.3 et que cela ne fonctionne pas, essayez ceci pour Mac OS X 10.9 …

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

Voir ce numéro pour plus de détails.

Vous n’avez probablement pas besoin du -- --with-system-v8 sur la dernière ligne mais je l’ai fait juste pour être sûr puisque je l’ai vu commencer à Fetching: libv8-3.11.8.17-x86_64-darwin-13.gem (1%) lorsque j’ai exécuté la commande …

En tout cas, cela a fonctionné pour moi quand toutes les autres choses n’ont pas fonctionné.

Pour toute personne rencontrant ce problème sur Mac OSX 10.8 Mountain Lion en essayant de mettre à jour son Gemfile avec gem 'therubyracer', '0.11.0' , il suffit de mettre à jour la gem du système libv8 (pas de désinstallation nécessaire):

 $ gem update libv8 $ bundle install 

modifier

Si vous utilisez Travis-CI (ou d’autres outils CI situés sur d’autres serveurs, je suppose), vous devrez également append explicitement le gem libv8 à votre Gemfile :

Gemfile

 gem 'libv8', '3.11.8.3' 

puis bundle install comme d’habitude. Notez simplement que l’ libv8 peut prendre beaucoup de temps, et j’ai remarqué que cela pourrait être la cause de dépassement des délais d’expiration de Travis CI , entraînant l’échec de votre build. Vous pouvez atténuer ce léger légèrement en n’incluant pas les gemmes d’environnement de développement dans vos builds:

.travis.yml

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

Mettre à jour

Ouais, à peu près tout mon Travis construit le timeout et échoue à cause de cela. Si quelqu’un sait comment résoudre ce problème (j’espère que le “downgrade therubyracer ” est un dernier recours), laissez-moi un commentaire!

Mise à jour 2

Cela peut ne pas fonctionner pour toutes les applications, mais il semblerait que mes applications Rails 3.2.9 n’aient pas réellement besoin de therubyracer ou de libv8 . Après avoir enlevé ces gemmes de mon Gemfile , j’ai confirmé que mes spécifications étaient passées, repoussées à Travis et construites avec succès. Donc, je suppose que se débarrasser de ces gemmes (si vous n’êtes pas sûr que vous en ayez réellement besoin) vaut au moins la peine d’essayer.

Mise à jour 3

Merci à Paul Annesley pour avoir confirmé que si vous êtes sur Mac OS X 10.8 Mountain Lion, vous n’avez pas besoin therubyracer joyau therubyracer puisque le système d’exploitation est déjà fourni avec Apple JavaScriptCore, son propre programme d’exécution Javascript. Au moment de la réponse originale, j’étais sur Snow Leopard et j’avais donc besoin de ça.

Pour moi, supprimer le fichier Gemfile.lock et exécuter l’ bundle install fonctionné, c’est magique.

OSX 10.8.2, ruby ​​1.9.3p125

Rien de ce qui précède n’a fonctionné pour moi … J’en avais marre d’essayer de trouver le bon bijou pour mon environnement, alors je me contentais de lier la cible g ++ à ce qui manquait:

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

Pas aussi utile pour les déploiements à distance, mais faites le travail sur mon poste de travail.

J’ai eu un problème similaire, mais il se plaignait également de ne pas trouver g ++ – 4.2. J’ai eu des outils de ligne de commande XCode installés, mais il cherchait /usr/bin/g++-4.2, j’avais g ++ (qui était un lien symbolique pointant vers llvm-g ++ – 4.2). Quoi qu’il en soit, je viens de créer un lien symbolique vers g ++ et j’ai réessayé l’installation du bundle … ça a marché!

$ cd /usr/bin

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

Eu la même erreur, cela a fonctionné pour moi:

  1. De la console: gem uninstall libv8

  2. Dans votre Gemfile, ajoutez ce qui suit:

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

Si vous étiez en cours de mise à niveau de therubyracer gem, vous souhaiterez peut-être également exécuter bundle update therubyracer . (Envisagez de spécifier un numéro de version)

C’était sur Mac 10.6 (Snow Leopard).