Сервер rails не запускается с mysql2, используя rvm & ruby ​​1.9.2-p0 на OSX 10.6.5

Я получаю следующую ошибку при запуске сервера 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

Я установил mysql2 со следующей командой после команды 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

У меня есть mysql2 в моем Gemfile, а также в файле database.yml и установке пакета завершает прекрасный

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

Я понимаю, что ошибка сервера rails связана с тем, что он не знает местоположение mysql_config на OSX, однако на gem install я указал правильное местоположение. Тем не менее, RVM gem не уважает местоположение mysql_config.

У кого-нибудь есть решение?

Ответ 1

Проблема связана с тем, что в mysql2 gem отсутствует динамическая библиотека из MySQL.

Более чистое решение, чем install_name_tool ..., должно будет обновить ваш DYLD_LIBRARY_PATH, чтобы добавить к нему файлы MySQL. Для этого обновите свой ~/.bash_profile, чтобы добавить папку библиотеки MySQL:

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

Примечание. Возможно, вам захочется обновить местоположение MySQL на основе вашей установки.

Это должно сохранить чистоту, а также гарантировать, что любой драгоценный камень или код, требующий динамических библиотек MySQL, найдут их.

Ссылка: http://lightyearsoftware.com/2011/02/mysql-5-5-on-mac-os-x/

Обновление ссылок Июль 2012: Изменение в OS X 10.8 делает простой метод более менее элегантным. Если вы установите эту переменную, каждый раз, когда вы запускаете программу setuid или setgid, вы получаете это предупреждение на stderr:

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

Разработчики Ruby, использующие Phusion Passenger Standalone, будут видеть это сообщение на своей консоли каждые пять секунд. Это очень раздражает, очень быстро.

Я подал ошибку с Apple. Его также в OpenRadar.

Тем временем существует также третий способ исправить проблему пути к клиентской библиотеке, которая не требует установки DYLD_LIBRARY_PATH (работающей вокруг этой проблемы 10.8) или взлома..bundle files with install_name_tool:

$ brew install mysql

Ответ 2

Я нашел ответ здесь: Mysql 5.5, Snow leopard и 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

Ответ 3

В OS X 10.8 (Mountain Lion) перечисленные ответы у всех есть проблемы, как указано в ответах и ​​комментариях.

  • Настройка DYLD_LIBRARY_PATH для включения /usr/local/mysql/lib дает предупреждения от OS X и brew
  • Использование install_name_tool для взлома, где нужно будет переделать двоичные образы gem каждый раз, когда камень установлен или обновлен.
  • Переключиться на brew mysql может не сработать; и в любом случае я не хочу перенастраивать уже действующую установку.

Более простое и надежное решение IMHO заключается в том, чтобы поместить ссылку на библиотеку в путь поиска динамической библиотеки по умолчанию, который удобно включает /usr/local/lib. То есть:

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

Ответ 4

Билл,

Ответ Frederic решит эту проблему, однако вам, возможно, придется изменить некоторые элементы в команде в зависимости от версий и того, как вещи названы в вашей системе.

Например, в самой последней версии mysql libmysqlclient.16.dylib на самом деле libmysqlclient.18.dylib. Попробуйте сделать:

locate libmysqlclient.18.dylib

Если это не возвращает путь, вы можете перейти к:

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

чтобы найти файл. Затем просто PWD, чтобы найти правильный каталог для команды.

Вам также нужно будет определить, какие фактические имена пакетов для рубинов вы установили. Вы можете найти это, используя

rvm info 

Например, моя установка 1.9.2 - ruby-1.9.2.p180, а не ruby-1.9.2p0. Это также нужно будет изменить в команде Frederics.

Итак, для меня команда Фредерика стала для исправления рубинов rvm для 1.8.7 и 1.9.2 соответственно:

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

ниже: http://lightyearsoftware.com/2011/02/mysql-5-5-on-mac-os-x/

Обновление Июль 2012:

Изменение OS X 10.8 делает простой метод более менее элегантным. Если вы установите эту переменную, каждый раз, когда вы запускаете программу setuid или setgid, вы получаете это предупреждение на stderr:

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

Разработчики Ruby, использующие Phusion Passenger Standalone, будут видеть это сообщение на своей консоли каждые пять секунд. Это очень раздражает, очень быстро.

Я подал ошибку с Apple. Его также в OpenRadar.

Тем временем существует также третий способ исправить проблему пути к клиентской библиотеке, которая не требует установки DYLD_LIBRARY_PATH (работающей вокруг этой проблемы 10.8) или взлома..bundle files with install_name_tool:

$ brew install mysql

Ответ 6

Шахта была в другом месте, мне пришлось использовать:

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.

Ответ 7

Вот что я делаю (подобно другим)

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

Ответ 8

Я застрял на этом некоторое время и пришел к другому решению.

Обратите внимание, что недостающая библиотека версия 16:

Библиотека не загружена: libmysqlclient.16.dylib(LoadError)

Оказывается, у меня была версия 20 этой библиотеки - libmysqlclient.20.dylib

Я правильно имел gem 'mysql2' в своем Gemfile, но мне нужно было удалить gem, gem uninstall mysql (у меня было несколько версий установленного gem), а затем сделать новый bundle install, чтобы получить только версию Мне нужна эта библиотека.

После этого он искал - и нашел - правильную версию этой библиотеки.

Ответ 9

Обновление mysql до последней версии и переустановка mysql2 gem работает для меня brew upgrade mysql gem uninstall mysql2 gem install mysql2

BTW: моя версия MySQL - 5.7.18, версия mysql2 gem 0.4.5