HOME  >  2015/03

Windows で Nokogiri のビルドエラー解決法 再び

久しぶりにアクセスログを見たら、
nokogiri のインストール方法で検索してくる方が結構いらっしゃるようなので、
最新の情報を書いておこうと思います。

# nokogiri に限った問題ではないので、条件によっては他の gem であっても解決するかも。

2015/4/27 追記
本稿は、Ruby 2.1.X までを使用している方が対象です。
Ruby 2.2.X 以降の場合は、本稿は役に立ちません。たぶん。

TL;DR 原因 & 解決法まとめ

原因: 古いバージョンの rubygems に不具合があり、環境に適した gem を取得できないため
[解決法1] 手動でインストールする gem をダウンロードする
または
[解決法2] rubygems をアップグレードする (おすすめ)

[解決法1] 手動でインストールする gem をダウンロードする

nokogiri | RubyGems.org | your community gem host
↑このページの VERSIONS から自分の環境にあったものをクリックしてから、
Download をクリックして gem をダウンロードしてください。
(Windows x64 なら x64-mingw32、Windows x86 なら x86-mingw32)
で、そのダウンロードした gem を以下のコマンドでインストールしてください。
gem install -l nokogiri-1.6.6.2-x64-mingw32.gem
1.6.6.2-x64-mingw32 の箇所はダウンロードした gem のファイル名に合わせて変更してください。

[解決法2] rubygems をアップグレードする (おすすめ)

gem -v
で、rubygems のバージョンを調べてください。
それが 2.3.0 未満の場合は、以下のコマンドで解決できると思います。
gem update --system
gem install nokogiri
ただし、Ruby 1.9系のようにしてください。
gem update --system 2.3.0
gem install nokogiri
gem install の挙動が変わるため、場合によっては、nokogiri インストール後に、
gem update --system 2.2.2
のようにして rubygems のバージョンを戻すことも考慮にいれてください。
2.2.2 の箇所は自分が使用していたバージョンを入力してください。
# ちなみに bundler を使用すると、こんなことしなくてもインストールできるみたいです。

何故 nokogiri をインストールできないのか

現在は、Windows 64bit 向けのバイナリ(すなわち、ビルド済みのもの)を含む gem が
正式に公開されています。
nokogiri | RubyGems.org | your community gem host
gem list --remote nokogiri
...
nokogiri (1.6.6.2 ruby java x64-mingw32 x86-mingw32, 1.6.1 x86-mswin32-60, 1.4.4.1 x86-mswin32)
...
x64-mingw32とか書いてあるのがソレです。
なので、gem install nokogiriとすると、
Nokogiri is built with the packaged libraries: libxml2-2.9.2, libxslt-1.1.28, zlib-1.2.8, libiconv-1.14.
とか表示されて、本来であれば問題無くインストールできるはずです。
(必須のライブラリを静的リンクしたビルド済みのバイナリが gem に含まれているのです)
ですが、rubygems (gem コマンドで呼びだすアレ)が古いと、
別プラットフォーム用の gem を取得してしまいビルドエラーになります。
Extracting libiconv-1.14.tar.gz into tmp/x86_64-w64-mingw32/ports/libiconv/1.14... OK
Running 'configure' for libiconv 1.14... ERROR, review
'C:/ruby/lib/.../nokogiri/tmp/x86_64-w64-mingw32/ports/libiconv/1.14/configure.log' to see what happened.
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers.  Check the mkmf.log file for more details.  You may
need configuration options.
で、 Windows 用の RubyInstaller に含まれている rubygems のバージョンが古い (たぶん 2.2.2) ので
多くの方が困っているみたいです。
gem -v
2.2.2
なので rubygems を最新版にしてから nokogiri をインストールしましょう。
gem update --system
gem install nokogiri
ただし、Ruby 1.9系の場合は rubygems 2.3.0 を使用してください。
gem update --system 2.3.0
gem install nokogiri
なぜ 2.3.0 なのかというと、最新の 2.4.X は、Ruby 1.9 系だと動かないみたいなので。
Native gem installation doesn't work on Windows with >= 2.4.0 · Issue #977 · rubygems/rubygems
# マイルストーンを見ると、2.5.0 でこの問題を解決する予定みたいです。

以上で問題は解決しますが、
場合によっては別の問題が発生する可能性が出てくるので、以下に 2 つほど記載します。
# それらが致命的な問題になることは滅多に無いとは思いますが、
# 頭の片隅にでもいれておくと、いざというとき役立つと思います。

# ちなみに RubyInstaller に、古いバージョンの rubygems が入っている理由ですが、
# 大元の Ruby(2.1.X) 本体に含まれている rubygems が古いためです。
# RubyInstaller 自体は Ruby 本体のものをそのまま使用しているだけなので。
# それに加えて、上であげた Ruby 1.9 系での不具合を RubyInstaller のメンテナさんが
# 気にしているというのもあるようです。
# 個人的にソースを見た限りでは、Ruby 2.0 以降の場合は
# 最新版の rubygems で問題ないと思っています。
# ですが、どのバージョンの rubygems を使うかは、各自それぞれ判断してください。

[問題1] gem install の挙動が変わる

ざっくりな説明ですが、以下のように rubygems の振舞いが変わります。
  • rubygems のバージョン < 2.3.0
    • platform = ruby の gem が優先される
  • rubygems のバージョン >= 2.3.0
    • platform = ユーザのプラットフォームの gem が優先される

例えば、nokogiri の例だと、
  • rubygems 2.2.2
    • nokogiri-1.6.6.2.gem (自前でビルドする必要がある gem) がインストールされる
  • rubygems 2.4.6
    • nokogiri-1.6.6.2-x64-mingw32.gem (ビルド済みで配布されている gem)がインストールされる
となります。

なので、最新の rubygems で不都合があれば、
以下のコマンドで使用していたバージョンに rubygems を戻してあげてください。
gem update --system 2.2.2
2.2.2 の箇所は自分が使用していたバージョンを入力してください。

[問題2] 依存ライブラリのバージョン

例えば、nokogiri の場合であれば、
自前でビルドする時は、依存ライブラリ(libxml2 とか)は、動的リンクされます。
一方、ビルド済みで配布されている gem の場合は、依存ライブラリは、静的リンクされています。

依存ライブラリのバージョンが重要とされるような場合は、
この辺りを気にしてあげる必要がありそうです。
スポンサーサイト



2015/03/01 | カテゴリ:Ruby | トラックバック(1) | コメント(0)
外部リンク

カンパのお願い
公開しているソフトウェアはフリーウェアなので無料でご利用いただけます。 気に入ってくださった方は、Amazon でお買い物をする際に下記のリンクを経由して頂ければ励みになります。

検索BOX・タグ一覧