Windows用 Ruby1.8 で json 1.5.1 を使う場合のエラーダイアログについて

「ActiveScriptRuby 1.8.7 を利用している環境で json 1.5.1-mswin32 を使うと、msvcrt-ruby191.dll を呼びに行こうとして失敗する問題」g:fragile:id:ferricks:20110130
Ruby 1.8.7とjson1.5.1 x86-mswin32で、「msvcrt-ruby191.dllが見つからない」エラー」id:MonteCut:20110219
等で書かれているように、mswin32版 Ruby1.8.7json 1.5.1 を自然にインストールして require "json" すると、msvcrt-ruby191.dll がないというエラーダイアログが出る。RubyInstaller のような mingw32版でも同じだ。


対策方法は4つあり*1

  1. 上記記事のように、古いバージョンを使う
  2. msvcrt-ruby191.dll を ruby\bin 等に入れておく
  3. 自分でバイナリをビルドする
  4. エラーダイアログを気にしない


1 は上記記事にあるので省略。

2 は、http://www.garbagecollect.jp/ruby/mswin32/ja/download/release.html から、zipファイルをダウンロードしてそこからmsvcrt-ruby191.dllだけ取りだして、ruby\bin とかに入れておく。

3 はビルド環境を予め作っておく必要があるが、今後も何かと便利なのでお勧め。mswin32の環境を作るのはVisual Studio Expressのインストールになるのだろうが、普段VC++でプログラムしない人にはなんだか牛刀だし、gemから自動起動するように環境設定するのも面倒かもしれない(やったことはないので実は簡単なのかも)。
バイナリ互換のmingw32版だとRubyInstallerのDevKitを使える。http://rubyinstaller.org/downloads/ から Development Kit をダウンロードして解凍し、下記を実行。実はmswin32環境では確認してないが、ディレクトリ構成は同じはずなので dk.rb install でうまくいくんじゃないかな。

C:\解凍先> dk.rb init
(config.ymlが出来るので内容を確認し必要なら修正)
C:\解凍先> dk.rb install

RubyInstallerを使っている人はレジストリを見て自動的にconfig.ymlが作られるが、そうでない人やmswin32版を使っている人はレジストリにエントリがないのでコメントだけのconfig.ymlが作られる。その場合、コメントに習って、

--- 
- C:/Ruby

の様に、RubyのインストールディレクトリをYAML形式で書いておく。


ビルド環境が出来たら、

C:\HOME> gem install json --platform ruby
Fetching: json-1.5.1.gem (100%)
Temporarily enhancing PATH to include DevKit...
Building native extensions.  This could take a while...
Successfully installed json-1.5.1
1 gem installed

でソースからバイナリ generator.so と parser.so が作られる*2


さて、一番簡単なのは 4 だ。Rubyのバージョンが1.8.7なので、実際に msvcrt-ruby191.dll 内のモジュールが呼ばれることはない。require の時のエラーダイアログだけ気にしなければ、あとは普通に動く(はず)。

*1:実は未確認のまま書いている部分があります

*2:Rubyディレクトリの lib\ruby\gems\1.8\gems\json-1.5.1\ext\json\ext\json\ext の下に出来る