web-dev-qa-db-ja.com

railsサーバーがrvmを使用してmysql2で起動に失敗する&Ruby 1.9.2-p0 on 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

RVMがRuby-1.9.2-p0コマンドを使用した後、次のコマンドでmysql2をインストールしました。

$ 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

Gemfileとdatabase.ymlファイルにmysql2があり、バンドルのインストールが正常に完了しました

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

RailsサーバーエラーはOSXのmysql_configの場所を認識していないことが原因ですが、gemのインストール時に正しい場所を指定しました。ただし、RVMのgemはmysql_configの場所を考慮していないようです。

誰かがこれに対する解決策を持っていますか?

38
Scott

この問題は、mysql2 gemにMySQLの動的ライブラリがないために発生します。

MySQLライブラリを追加するには、install_name_tool ...よりもクリーンなソリューションでDYLD_LIBRARY_PATHを更新する必要があります。これを行うには、~/.bash_profileを更新してMySQLライブラリフォルダーを追加します。

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

注:インストールに基づいてMySQLの場所を更新することができます

これにより、物事がきれいに保たれるだけでなく、MySQL動的ライブラリーを必要とするgemまたはコードがそれらを確実に見つけられるようになります。

リファレンス: http://lightyearsoftware.com/2011/02/mysql-5-5-on-mac-os-x/

リファレンス更新2012年7月:OS X 10.8の変更により、上記の簡単な方法はエレガントではなくなりました。この変数を設定すると、setuidまたはsetgidプログラムを実行するたびに、次の警告がstderrに表示されます。

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

Phusion Passenger Standaloneを使用するRuby開発者は、このメッセージを5秒ごとにコンソールに表示します。それは本当にイライラし、非常に速くなります。

Appleにバグを報告しました。 OpenRadarにもあります。

それまでの間、DYLD_LIBRARY_PATHの設定(この10.8の問題を回避する)またはinstall_name_toolを使用した.bundleファイルのハッキングを必要としないクライアントライブラリパスの問題を修正する3つ目の方法もあります。

$ brew install mysql

私はここで答えを見つけました: Mysql 5.5、Snow leopard and 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

OS X 10.8(Mountain Lion)では、回答とコメントに記載されているように、リストされている回答にはすべて問題があります。

  • / usr/local/mysql/libを含めるようにDYLD_LIBRARY_PATHを設定すると、OS Xおよびbrewから警告が出されます
  • install_name_toolを使用して、gemバイナリが見える場所をハックするには、gemがインストールまたはアップグレードされるたびにやり直す必要があります。
  • brewのmysqlに切り替えると、mysqlが機能しない場合があります。とにかく、すでに機能しているインストールを再構成したくない

よりシンプルで堅牢なソリューションIMHOは、/usr/local/libが含まれているデフォルトの動的ライブラリ検索パスにライブラリへのリンクを配置することです。あれは:

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

ビル、

フレデリックの答えはこの問題を解決しますが、バージョンやシステムでの命名方法によっては、コマンドの一部の項目を変更する必要がある場合があります。

たとえば、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.2p0ではなくRuby-1.9.2.p180です。これはFredericsコマンドでも変更する必要があります。

それで、私にとって、フレデリックのコマンドは、それぞれ1.8.7と1.9.2のRVMルビーを修正するためになりました:

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

以下を介して: http://lightyearsoftware.com/2011/02/mysql-5-5-on-mac-os-x/

2012年7月更新:

OS X 10.8での変更により、上記の簡単な方法はエレガントではなくなりました。その変数を設定すると、setuidまたはsetgidプログラムを実行するたびに、stderrで次の警告が表示されます。

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

Phusion Passenger Standaloneを使用するRuby開発者は、このメッセージを5秒ごとにコンソールに表示します。それは本当にイライラして、非常に速くなります。

Appleにバグを報告しました。 OpenRadarにもあります。

それまでの間、DYLD_LIBRARY_PATHの設定(この10.8の問題を回避する)またはinstall_name_toolを使用した.bundleファイルのハッキングを必要としないクライアントライブラリパスの問題を修正する3つ目の方法もあります。

$ brew install mysql
3
Todd

鉱山は別の場所にあり、私は使用する必要がありました:

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

私はしばらくこれにこだわっていて、別の解決策を見つけました。

不足しているライブラリがバージョン16であることに注意してください:

ライブラリがロードされていません:libmysqlclient.16.dylib(LoadError)

そのライブラリのバージョン20があったことがわかりました-libmysqlclient.20.dylib

私は正しくgem 'mysql2'はGemfileにありますが、必要なのはgemをアンインストールすることでしたgem uninstall mysql(私はgemの複数のバージョンをインストールしていました)そして新しいbundle installこのライブラリに必要なバージョンを取得するちょうど

その後、そのlibの正しいバージョンを探して見つけました。

1
Drew

Mysqlを最新バージョンにアップグレードし、mysql2 gemを再インストールするとbrew upgrade mysqlgem uninstall mysql2gem install mysql2

ところで、MySQLのバージョンは5.7.18、mysql2 gemのバージョンは0.4.5です。

0
Zernel

これが私がやっていることです(他の人と同じです)

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