rails server не запускается с mysql2, используя rvm & ruby ​​1.9.2-p0 на OSX 10.6.5 - PullRequest
37 голосов
/ 22 декабря 2010

Я получаю следующую ошибку при запуске сервера 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 use 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 я указал правильное местоположение.Тем не менее, жемчужина RVM не учитывает расположение mysql_config, которое кажется.

У кого-нибудь есть решение этой проблемы?

Ответы [ 9 ]

64 голосов
/ 01 апреля 2011

Проблема связана с тем, что в mysql2 отсутствует динамическая библиотека из 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 с помощью install_name_tool:

$ brew install mysql
22 голосов
/ 25 декабря 2010

Я нашел ответ здесь: Mysql 5.5, Снежный барс и рельсы

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
8 голосов
/ 24 января 2013

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

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

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

ln -s /usr/local/mysql/lib/libmysqlclient.18.dylib /usr/local/lib
5 голосов
/ 28 марта 2011

Билл,

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

Например, в самой последней версии 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.Это нужно будет изменить и в команде Фредерика.

Итак, для меня команда Фредерика стала для исправления рубинов 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
3 голосов
/ 04 ноября 2012

ниже через: 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 с помощью install_name_tool:

$ brew install mysql
1 голос
/ 17 мая 2016

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

Обратите внимание, как отсутствует библиотека версия 16 :

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

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

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

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

1 голос
/ 27 января 2012

Мой был в другом месте, я должен был использовать:

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.
0 голосов
/ 28 июля 2017

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

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

0 голосов
/ 12 декабря 2011

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

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...