2011年2月7日月曜日

ruby-pg on windows

Windows でも Ruby を使う必要がでてきた。しかも PostgreSQLとセットで。

環境は Windows7 Home (32bit) 。Windows ローカルで動いている PostgreSQL (8.4) に Ruby 1.9.2 からアクセスできればよい。ただ...やり取りするデータ量が多いので libpq が使う必要がある。libpq のラッパーモジュール pg (ruby-pg) があるが、C 拡張なのでインストールは案の定つまずいた。しかし使い慣れない Windows にどうにか入れることができたのでここにメモしておく。

Windows用の Ruby はRubyInstallerのバイナリ(RubyInstaller 1.9.2-p136)を利用。あわせて同じサイトで配布している DevKit も入れる。これに migw32-gcc や make などが入っていて拡張モジュールのビルドなどに必要。その辺のインスト手順はサイトの説明通りで出来たので省略。

肝心の pg のインストから:

gem install pg

とやるが、DevKit とか入れている割にさくっとは逝かなかった。エラーログには

Temporarily enhancing PATH to include DevKit...
Building native extensions.  This could take a while...
ERROR:  Error installing pg:
        ERROR: Failed to build gem native extension.

C:/Ruby192/bin/ruby.exe extconf.rb
checking for pg_config... yes
Using config values from C:\Program Files\PostgreSQL\8.4\bin/pg_config.exe
extconf.rb:13:in ``': No such file or directory - C:\Program Files\PostgreSQL\8.
4\bin/pg_config.exe --includedir (Errno::ENOENT)
        from extconf.rb:13:in `
'

と出ている。コンパイル以前の問題。しかしよくエラーメッセージを見ると pg_config のパスに \ と / が混在している。ext/extconf.rbを見ると

if pgconfig = find_executable( pgconfig )
 $CPPFLAGS << " -I%s" % [ read_cmd_output(pgconfig, '--includedir') ]
 $LDFLAGS << " -L%s" % [ read_cmd_output(pgconfig, '--libdir') ]
end
あたりでとまっているのが判った。単に pgconfig を正しく設定すれば良さそう。extconf.rb にパスを直書きし
if pgconfig = find_executable( pgconfig )
pgconfig='c:/progra~1/postgr~1/8.4/bin/pg_config'
 $CPPFLAGS << " -I%s" % [ read_cmd_output(pgconfig, '--includedir') ]
 $LDFLAGS << " -L%s" % [ read_cmd_output(pgconfig, '--libdir') ]
end

ruby extconf.rb を実行すると Makefile が出来た。あとは make, make installでさくっと拡張モジュールを作成。

DevKit 万歳である。

作業前に DevKit にちゃんとパスを切らないとgccは起動しないし make も見つからない。作業前にc:\DevKit\devkitvars.bat を呼ぶ。これを呼んでおくとドス窓で ls とかやってもエラーにならずファイル一覧が見られる。cp とか rm も入っていた。

ローカルのPostgreSQLを平文パスワードで使う分には問題なく Ruby からアクセスできた。openssl とか使う場合はどうなんだろう? DevKit に openssl のライブラリが入っていたりするのかな..? (謎)

0 件のコメント:

コメントを投稿