Windows で Nokogiri のビルドエラー解決法 再び
久しぶりにアクセスログを見たら、
nokogiri のインストール方法で検索してくる方が結構いらっしゃるようなので、
最新の情報を書いておこうと思います。
# nokogiri に限った問題ではないので、条件によっては他の gem であっても解決するかも。
2015/4/27 追記
本稿は、Ruby 2.1.X までを使用している方が対象です。
Ruby 2.2.X 以降の場合は、本稿は役に立ちません。たぶん。
[解決法1] 手動でインストールする gem をダウンロードする
または
[解決法2] rubygems をアップグレードする (おすすめ)
↑このページの VERSIONS から自分の環境にあったものをクリックしてから、
Download をクリックして gem をダウンロードしてください。
(Windows x64 なら x64-mingw32、Windows x86 なら x86-mingw32)
で、そのダウンロードした gem を以下のコマンドでインストールしてください。
それが 2.3.0 未満の場合は、以下のコマンドで解決できると思います。
※
# ちなみに bundler を使用すると、こんなことしなくてもインストールできるみたいです。
正式に公開されています。
nokogiri | RubyGems.org | your community gem host
なので、
(必須のライブラリを静的リンクしたビルド済みのバイナリが gem に含まれているのです)
ですが、rubygems (gem コマンドで呼びだすアレ)が古いと、
別プラットフォーム用の gem を取得してしまいビルドエラーになります。
多くの方が困っているみたいです。
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 を使うかは、各自それぞれ判断してください。
例えば、nokogiri の例だと、
なので、最新の rubygems で不都合があれば、
以下のコマンドで使用していたバージョンに rubygems を戻してあげてください。
自前でビルドする時は、依存ライブラリ(libxml2 とか)は、動的リンクされます。
一方、ビルド済みで配布されている gem の場合は、依存ライブラリは、静的リンクされています。
依存ライブラリのバージョンが重要とされるような場合は、
この辺りを気にしてあげる必要がありそうです。
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 nokogirigem 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 の場合は、依存ライブラリは、静的リンクされています。
依存ライブラリのバージョンが重要とされるような場合は、
この辺りを気にしてあげる必要がありそうです。
スポンサーサイト