Mac OS X Leopard(10.5.7)でMySQLのRubyバインディングがうまく入らない
Mac OS X Leopard(10.5.7)でRailsでなんかアプリつくろうと思って、環境を整えておりました。
まず、最新のrubygemsとrailsを。
rubygems1.3.5とrails2.3.4が入りました。最新ぽいです。
$ sudo gem update --system
$ sudo gem install rails
ここまではよかったのですが、モデルを作って、マイグレーションするかという段階で
rake db:migrate
したところ、次のようなエラーが出るようになり、すすめなくなりました。
rake aborted!
Client does not support authentication protocol requested by server; consider upgrading MySQL client
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/mysql.rb:453:in `read'
mysqlを最新にするのを忘れていた!ということで
$ sudo env ARCHFLAGS="-arch i386" gem instal mysql -- --with-mysql-dir=/usr/local/mysql --with-mysql-lib=/usr/local/mysql/lib --with-mysql-include=/usr/local/mysql/include
して、うまくはいったかな?と思いまたrake db:migrateしてみますが、同じエラー。
irbでrequire "mysql"してみてもエラーでない。
それどころか
m = Mysql.new("localhost", "root" ,"")
だとクエリも通る!
おかしすぎる。パスワードを設定したユーザのみ、上記のようなエラーが出る。エラーメッセージから察するにクライアントライブラリが古いのは分かるんだけど、今mysqlのgemは最新版を入れたばかりだし...と悩んでたのですが、ふとirbやrake時にロードされているmysqlはOS Xに標準でぶちこまれているものなのではないかと思い、いろいろ探したところ、
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/
にmysql.rbがおりました。こいつくせ〜〜〜
irbで
$ irb
>> require "mysql"
=> true
>> Mysql.client_info
=> "4.0-ruby-0.2.5"
ふむふむ。問題のmysql.rbを見てみると
VERSION = "4.0-ruby-0.2.5"
と定義があるので、まちがいなさそう。
こいつをロードさせなければいいのだろう。
ロードされないことを確認するため、一度gemも削除
$ sudo gem uninstall mysql
ほいでもって、問題のファイルを拡張子を変えてロードされなくしてみる。
$ cd /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/
$ sudo mv ./mysql.rb ./mysql.rb_
んでirbでテスト。
$ irb
>> require "mysql"
LoadError: no such file to load -- mysql
from /Library/Ruby/Site/1.8/rubygems/custom_require.rb:31:in `gem_original_require'
from /Library/Ruby/Site/1.8/rubygems/custom_require.rb:31:in `require'
from (irb):1
どうやらロードされなくなった。やはり問題の見えざるmysqlライブラリはヤツだったようです。gem入れたらよくなるかどうかテスト。
先ほどのsudo env ... gem install mysql ...のコマンドでmysqlのgemをインストール。
db:migrateタスク実行!おお、ちゃんと動いた...
3時間ぐらいはまってしまいました。
追記:
OS X 10.6(Snow Leopard)では64bit番のMySQLを使って
http://d.hatena.ne.jp/ichiro_tanaka/20090910/1252583283
にある通りにやるとうまく行きました。