Windows上でRubyからMySQL 5.1を使う

現在Windows上のRubyMySQLを使う場合、安定性や速度の面で最適なバインディングmysql-win 2.8.1だと思われますが、リリースのアナウンスにも書かれている通り、このgemが対応するMySQLのバージョンは5.0.83です。
しかし機能や安定性など、様々な理由でMySQL 5.1を使いたい場合もあるはずです。
そこで、mysql gemを最新のソースツリーからビルドすることでMySQL 5.1に対応する方法を説明します。

必要なもの

Ruby

Ruby Installer for Windowsから適当なものをダウンロードしてインストールしてください。私は諸事情からrubyinstaller-1.8.6-p383-rc1.exeを使いました。もちろんpikで好きなバージョンをインストールしても構いません(多分)。

Development Kit

ここで言うDevelopment Kitは、ネイティブモジュールを含むgemをWindows上でビルドするためのツールです。前述のRuby Installer for Windowsにあります。
7-Zipで展開したら、中にあるINSTALL.txtに従って以下の作業をします。

  • binフォルダとdevkitフォルダをRubyのインストールフォルダへ移動
  • devkit/msys/1.0.11/etc/fstabを修正

fstabは下のような内容になっているので、「C:/Ruby」の部分を実際のRubyのインストールパスに直してやります。

C:/Ruby/devkit/gcc/3.4.5 /mingw
C:/Ruby/devkit/msys/1.0.11/usr/local /usr/local
msysgit

msysgitWindows用のGitです(Gitは分散リポジトリ型のバージョン管理ツールです)。プロジェクトのホームページから最新版をダウンロード、インストールしてください。今ならGit-1.7.0.2-preview20100309.exeです。

mysql-gemのソース

今回元にするソースは、mysql-gemという名前でLuis Lavena氏が管理、開発しているバージョンです(mysql-win 2.8.1をリードしたのも同氏です)。
gitが使えるようになったらリポジトリから取り寄せましょう。

git clone http://github.com/luislavena/mysql-gem.git

gemを作る

mysql-gemは以下のgemに依存しているので、先にインストールします。

gem install hoe rake-compiler rubyforge

rubyforge gemはセットアップが必要なので、下のように実行してやります。

rubyforge setup

セットアップが終わると”~/.rubyforge/user-config.ymlを編集しろ”というようなメッセージが出ますが、mysql-gemをビルドするだけなら必要ありません。
準備ができたら、ソースのルートへ移動して、gemを作ります。

cd mysql-gem
rake gem

pkg/mysql-2.8.2.gemができるはずです。

インストール

インストールのプロセスは、ネイティブモジュールをコンパイルしてMySQLのライブラリをリンクします。そのためにヘッダファイルとライブラリのパスを指定してやる必要があるのですが、空白を含んだパスを指定するとコンパイルは失敗します。もしMySQLをスペースを含んだパス(C:\Program Files\MySQL\MySQL Server 5.1など)にインストールしていたら、下のようにsubstコマンドを使って空白のないパスにマッピングしてやるとよいでしょう。

subst m: "C:\Program Files\MySQL\MySQL Server 5.1"

上の場合、ヘッダファイルはm:\include、ライブラリはm:\lib\optで参照できるようになります。
インストールのコマンドラインは次のようになります(includeとlib\optは適切なパスに置き換えてください)。

gem install pkg\mysql-2.8.2.gem -- --with-mysql-include=m:\include --with-mysql-lib=m:\lib\opt

動作確認

下のようなコマンドでconnectできることを確認しましょう(MySQLサーバのホスト名、ユーザ名、パスワードは適宜差し替えてください)。

ruby -rubygems -e "require 'mysql'; puts Mysql.connect('localhost', 'root', 'password').server_info"