web-dev-qa-db-fra.com

rails server ne parvient pas à démarrer avec mysql2 avec rvm & Ruby 1.9.2-p0 sur OSX 10.6.5

Le message d'erreur suivant s'affiche lorsque je démarre le serveur Rails:

$ Rails server
/Users/ssmith/.rvm/gems/Ruby-1.9.2-p0/gems/mysql2-0.2.6/lib/mysql2.rb:7:in `require':     dlopen(/Users/ssmith/.rvm/gems/Ruby-1.9.2-p0/gems/mysql2-0.2.6/lib/mysql2/mysql2.bundle, 9): Library not loaded: libmysqlclient.16.dylib (LoadError) 
Referenced from: /Users/ssmith/.rvm/gems/Ruby-1.9.2-p0/gems/mysql2- 0.2.6/lib/mysql2/mysql2.bundle
Reason: image not found - /Users/ssmith/.rvm/gems/Ruby-1.9.2-p0/gems/mysql2-    
0.2.6/lib/mysql2/mysql2.bundle

J'ai installé mysql2 avec la commande suivante après l'utilisation de la commande rvm Ruby-1.9.2-p0:

$ gem install mysql2 -- --with-mysql-dir=/usr/local/mysql --with-mysql-config=/usr/local/mysql/bin/mysql_config
Building native extensions.  This could take a while...
Successfully installed mysql2-0.2.6
1 gem installed
Installing ri documentation for mysql2-0.2.6...
Enclosing class/module 'mMysql2' for class Client not known
Installing RDoc documentation for mysql2-0.2.6...
Enclosing class/module 'mMysql2' for class Client not known

J'ai mysql2 dans mon Gemfile ainsi que dans le fichier database.yml et l'installation en bundle se termine bien

$ bundle show mysql2
/Users/ssmith/.rvm/gems/Ruby-1.9.2-p0/gems/mysql2-0.2.6

Je comprends que l’erreur du serveur Rails est due au fait qu’il ne connaissait pas l’emplacement mysql_config sur OSX, cependant, lors de l’installation de gem, j’ai spécifié l’emplacement correct. Pourtant, le joyau de RVM ne respecte pas l'emplacement de mysql_config, semble-t-il.

Quelqu'un a une solution à cela?

37
Scott

Le problème vient du mysql2 qui manque la bibliothèque dynamique de MySQL.

Une solution plus propre que install_name_tool ... aurait besoin de mettre à jour votre DYLD_LIBRARY_PATH pour y ajouter des bibliothèques MySQL. Pour ce faire, mettez à jour votre ~/.bash_profile pour ajouter le dossier de la bibliothèque MySQL:

export DYLD_LIBRARY_PATH="/usr/local/mysql/lib:$DYLD_LIBRARY_PATH"

Remarque: Vous voudrez peut-être mettre à jour l’emplacement MySQL en fonction de votre installation.

Cela devrait garder les choses en ordre, mais également garantir que tout bijou ou code nécessitant des bibliothèques dynamiques MySQL les trouvera.

Référence: http://lightyearsoftware.com/2011/02/mysql-5-5-on-mac-os-x/

Référence à la mise à jour, juillet 2012: Un changement dans OS X 10.8 rend la méthode facile ci-dessus moins élégante. Si vous définissez cette variable, chaque fois que vous exécutez un programme setuid ou setgid, vous obtenez cet avertissement sur stderr:

dyld: DYLD_ environment variables being ignored because main executable (...) is setuid or setgid

Les développeurs Ruby utilisant Phusion Passenger Standalone verront ce message affiché dans leur console toutes les cinq secondes. Ça devient vraiment énervant, très vite.

J'ai déposé un bug avec Apple. C’est aussi chez OpenRadar.

Entre-temps, il existe également un troisième moyen de résoudre le problème du chemin de la bibliothèque client qui ne nécessite pas la définition de DYLD_LIBRARY_PATH (solution au problème 10.8) ou le piratage des fichiers .bundle avec nom_installation_install:

$ brew install mysql

J'ai trouvé la réponse ici: Mysql 5.5, Snow Leopard et Rails

Sudo install_name_tool -change libmysqlclient.16.dylib /usr/local/mysql/lib/libmysqlclient.16.dylib ~/.rvm/gems/Ruby-1.9.2-p0/gems/mysql2-0.2.6/lib/mysql2/mysql2.bundle
22
Frederic

Sous OS X 10.8 (Mountain Lion), les réponses répertoriées présentent toutes des problèmes, comme indiqué dans les réponses et les commentaires.

  • Configurer DYLD_LIBRARY_PATH pour inclure/usr/local/mysql/lib donne des avertissements de OS X et de brew
  • Utiliser install_name_tool pour pirater l'endroit où l'aspect binaire de la gemme devrait être refait à chaque fois que la gem est installée ou mise à niveau.
  • Passer à brew 's mysql peut ne pas fonctionner; et en tout cas je ne veux pas reconfigurer une installation déjà opérationnelle

Une solution plus simple et robuste IMHO consiste à insérer un lien vers la bibliothèque dans le chemin de recherche de bibliothèque dynamique par défaut, qui inclut commodément /usr/local/lib. C'est:

ln -s /usr/local/mysql/lib/libmysqlclient.18.dylib /usr/local/lib
8
ronen

Facture,

La réponse de Frédéric résoudra ce problème. Cependant, vous devrez peut-être modifier certains éléments de la commande en fonction des versions et de la manière dont les éléments sont nommés sur votre système. 

Par exemple, sur la version la plus récente de mysql, libmysqlclient.16.dylib est en fait libmysqlclient.18.dylib. Essayez de faire un:

locate libmysqlclient.18.dylib

Si cela ne retourne pas le chemin, vous pouvez aller à: 

/usr/local/{your-mysql}/lib

trouver le fichier. Ensuite, juste un PWD pour trouver le bon répertoire pour la commande.

Vous devrez également déterminer quels sont les noms de paquetages des rubis que vous avez installés. Vous pouvez trouver cela en utilisant

rvm info 

Par exemple, mon installation de 1.9.2 est Ruby-1.9.2.p180, pas Ruby-1.9.2p0. Cela devra également être changé dans la commande Frederics.

Donc, pour moi, le commandement de Frédéric est devenu de réparer les rubis de la médiane pour 1.8.7 et 1.9.2, respectivement:

Sudo install_name_tool -change libmysqlclient.18.dylib /usr/local/mysql-5.5.10-osx10.6-x86_64/lib/libmysqlclient.18.dylib ~/.rvm/gems/Ruby-1.8.7-p334/gems/mysql2-0.2.6/lib/mysql2/mysql2.bundle

Sudo install_name_tool -change libmysqlclient.18.dylib /usr/local/mysql-5.5.10-osx10.6-x86_64/lib/libmysqlclient.18.dylib ~/.rvm/gems/Ruby-1.9.2-p180/gems/mysql2-0.2.6/lib/mysql2/mysql2.bundle
5
dbaugh

ci-dessous via: http://lightyearsoftware.com/2011/02/mysql-5-5-on-mac-os-x/

Mise à jour juillet 2012: 

Un changement dans OS X 10.8 rend la méthode facile ci-dessus moins élégante. Si vous définissez cette variable, chaque fois que vous exécutez un programme setuid ou setgid, vous obtenez cet avertissement sur stderr:

dyld: DYLD_ environment variables being ignored because main executable (...) is setuid or setgid

Les développeurs Ruby utilisant Phusion Passenger Standalone verront ce message affiché dans leur console toutes les cinq secondes. Ça devient vraiment énervant, très vite.

J'ai déposé un bug avec Apple. C’est aussi chez OpenRadar.

Entre-temps, il existe également un troisième moyen de résoudre le problème du chemin de la bibliothèque client qui ne nécessite pas la définition de DYLD_LIBRARY_PATH (solution au problème 10.8) ou le piratage des fichiers .bundle avec nom_installation_install:

$ brew install mysql
3
Todd

La mienne était dans un endroit différent, je devais utiliser:

Sudo install_name_tool -change libmysqlclient.18.dylib /usr/local/mysql/lib/libmysqlclient.18.dylib /Library/Ruby/Gems/1.8/gems/mysql2-0.3.11/lib/mysql2/mysql2.bundle.
1
PaulIsLoud

Je suis resté coincé là-dessus pendant un moment et je suis arrivé à une solution différente. 

Notez que la bibliothèque manquante est version 16 :

Bibliothèque non chargée: libmysqlclient.16.dylib (LoadError)

Il se trouve que j'avais la version 20 de cette bibliothèque - libmysqlclient.20.dylib

J'ai correctement eu gem 'mysql2' dans mon Gemfile, mais je devais désinstaller la gem, gem uninstall mysql (plusieurs versions de la gem étaient installées), puis créer un nouveau bundle install pour obtenir seulement la version dont j'avais besoin de cette bibliothèque .

Après cela, il a cherché - et a trouvé - la version correcte de cette lib.

0
Drew

Mettre à jour mysql vers la dernière version et réinstaller mysql2 gem fonctionne pour moi brew upgrade mysqlgem uninstall mysql2gem install mysql2

BTW: Ma version de MySQL est 5.7.18, la version de mysql2 gem est 0.4.5

0
Zernel

Voici ce que je fais (semblable aux autres)

Sudo install_name_tool -change libmysqlclient.18.dylib /usr/local/mysql/lib/libmysqlclient.18.dylib ~/.rvm/gems/Ruby-1.9.2-p290/gems/mysql2-0.3.10/lib/mysql2/mysql2.bundle
0
aren55555