WindowsのRuby 2.0でNokogiriを使う

WindowsのRuby 2.0でXML解析のNokogiriを使う方法を紹介します。

WindowsのRuby 2.0でXML解析のNokogiriを使うのにちょっと苦労しましたのでどう解決したかを記録しておきます。

使っているRubyはrubyinstallerの2.0.0で、WindowsにはMinGW/MSYSが導入済みです。Installing Nokogiriには

Luckily for you, building on Windows is so difficult that we’ve done it for you

などと書いてありましたが

$ gem install nokogiri

してもエラーになるばかりでした。

解決方法

どう解決したかを端的に言うとlibxml2, libxsltを自前でコンパイルしました。なので WindowsのRuby 2.0でNokogiriを使う 手順はこうなります。

  1. libxml2 の最新版を自前でコンパイル&インストールする

ftp://xmlsoft.org/libxml2/ から libxml2-2.9.0.tar.gz をダウンロードしてコンパイルします。

  $ tar xzvf libxml2-2.9.0.tar.gz
  $ cd libxml2-2.9.0
  $ sh ./configure
  $ make
  $ make install
  1. libxslt の最新版を自前でコンパイルする

ftp://xmlsoft.org/libxml2/ から libxslt-1.1.28.tar.gz をダウンロードしてコンパイルします。

  $ tar xzvf libxslt-1.1.28.tar.gz
  $ cd libxslt-1.1.28
  $ sh ./configure --with-libxml-prefix=/usr/local
  $ make
  $ make install
  1. nokogiri をインストールする

gemに複雑なオプションを渡すので要注意です。

  $ gem install nokogiri --platform=ruby -- \
      --with-xml2-include=/usr/local/include/libxml2 \
      --with-xml2-lib=/usr/local/lib \
      --with-xslt-include=/usr/local/include \
      --with-xslt-lib=/usr/local/lib

これでNokogiriが使えるようになりました。簡単なスクリプトを書いて動作する(DLLがロードできる)ことを確かめておきましょう。

  • テストスクリプト: test.rb

    require 'pp'
    require 'nokogiri'
      
    doc = Nokogiri.XML('<foo><bar/></foo>')
    pp doc
    
  • 実行結果

    $ ruby test.rb
    #(Document:0x159fe7c {
      name = "document",
      children = [
        #(Element:0x159f3e4 {
          name = "foo",
          children = [ #(Element:0x159e514 { name = "bar" })]
          })]
      })
    

経緯

以下はただの日記なので読まなくて良いです。

とある事情(お仕事)でNokogiriを使ったソースをメンテしなきゃいけなくなりました。しかし

$ gem install nokogiri

ではインストールできません。エラーメッセージをちゃんと読むとlibxml2が見つからないとのこと。早速MinGWにないか確認しインストールします。

$ mingw-get list | grep ^Package | grep libxml
Package: msys-libxml2                                    Subsystem: msys

$ mingw-get install msys-libxml2

MSYSにあったのでインストールしましたが、これが結果的に大失敗でした。

libxml2をインストールしてもう一回 gem install nokogiri -- ...(オプション略) しましたが、今度はlibxsltが見つからない。はいはい入れれば良いのですね。ただこっちはMinGWにはないので、上記で示したように xmlsoft.org から持ってきてコンパイル&インストールしました。

で、上記のようなテストスクリプトを実行するも、DLLがロードできないとかぬかします。ああもう良いLinux使うから!

ってのが昼間に起こったことでした。お仕事は Linux で片付けて、続きは帰宅後の夜中。

Visual Studioを使って何が起こってるか詳細を観察。libxml2とlibxsltのDLLをロード後に落ちていることを確認。はたとlibxml2が悪さをしているんじゃないか、と思い付き…あとは上に書いたとおりです。

いやぁ…WindowsでRubyを使うのは地雷原を歩くが如しですね (゚∀゚)