Nokogiriにハマるつもりじゃなかった

またしてもrails入れようとしてハマった…。

開発環境

  • Mac OSX Yosemite 10.10.4
  • Ruby 2.2.3
  • Gem 2.4.5
  • Homebrew 0.9.5

Nokogiriがインストールできない

railsが依存してるNokogiriってgemがインストール出来ない問題っていうのは、古来より広く知られたトラブルであり、数多の勇者が命からがら辛くも勝利し、ruby界のマーフィーズゴースト的な存在である(喩えベタ)。

今回私も出くわし、当記事執筆時点では未だ以って解決していないのだが、トラブルシューティング録を付けていこう。二度とこのマーフィーズゴーストにはやられまいと思う次第である。

Nokogiriって何?

いっつもスルーしてた。rubyでスクレイピングするためのgem。XMLやHTMLをパースして、その中身を走査するためのものなので、まあ、重要ですよね。「ノコギリ」って名前に、なんかイラッとしないでもない。

まずは普通にgem install rails

$ gem install rails

すると、こんな感じのエラー。

Fetching: nokogiri-1.6.6.2.gem (100%)
Building native extensions.  This could take a while...
ERROR: Error installing rails:
ERROR: Failed to build gem native extension.

出ましたよ、Nokogiriでエラー。

XCode Command Lineをアップデート

ログを読むと

To install Command Line Tools, try running `xcode-select --install` on
terminal and follow the instructions.  If it fails, open Xcode.app,
select from the menu "Xcode" - "Open Developer Tool" - "More Developer
Tools" to open the developer site, download the installer for your OS
version and run it.

とありますんで、一旦XCode Command Line Toolsをアップデート。失礼しました。

再度、railsをインストール

すると、再度Nokogiriがエラー吐いてる。libiconvの位置が分からんと言うことだな。分かる。

Building nokogiri using packaged libraries.
checking for gzdopen() in -lz... yes
checking for iconv... no
-----
libiconv is missing.  Please locate mkmf.log to investigate how it is failing.
-----

しれっと言うが、mkmf.logどこよ

しれっと「mkmf.log見れや」と来るが、それどこよ、と。多分Gem、相当ズボラ。仕方ないので探す。

find / -name mkmf.log

私はrbenvを使っているので、こんなところにありました。

~/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/extensions/x86_64-darwin-14/2.2.0-static/nokogiri-1.6.6.2/mkmf.log

Homebrewでパスを通す

libiconvにパスが通ってないんじゃないか、いやそもそもインストールされてないんじゃないかって説があるので、Homebrewで確認。

$ brew tap homebrew/dupes
Warning: Already tapped!

リポジトリは問題ないと。

$ brew install libxml2 libxslt libiconv
Warning: libxml2-2.9.1 already installed
Warning: libxslt-1.1.28 already installed
Warning: libiconv-1.14 already installed

インストールされてる。問題ない。

$ brew link --force libxml2 libxslt libiconv
Warning: Already linked: /usr/local/Cellar/libxml2/2.9.1
Warning: Already linked: /usr/local/Cellar/libxslt/1.1.28
Warning: Already linked: /usr/local/Cellar/libiconv/1.14

リンクされてる。問題ない。もーー。

インストール時にパスを指定してやる

こことかに書かれている通り、システムライブラリにパスを通してやって、$ gem install nokogiri -- --use-system-librariesみたいな方法も有効みたいです。ただ、自分の環境では上手く動かず。

$ gem install nokogiri -- --with-iconv-dir=/usr/local/Cellar/libiconv/1.14みたいな形で、Homebrewでインストールしたlibiconvのパスを明示してやるという方法もある。この場合、libiconvは通って上手く動作するんだが、今度はlibxml2がないだの、色々言われるので、最終的に

gem install nokogiri -- --with-iconv-dir=/usr/local/Cellar/libiconv/1.14 --with-libxml2-dir=/usr/local/Cellar/libxml2/2.9.1

とか、てんこ盛りで試してやってもだめ…。そもそも、こうも連続でパスが通ってないと言われるってことはなにか根本的な原因を取りこぼしているという可能性が高いという経験則。

ARCHFLAGSを設定する

こいつはMac特有のバグですよ…っていうことで、pgなどをインストールするときにお馴染みの、ARCHFLAGSを設定してやります。ARCHFLAGSってあんまり説明ないんですけど、Macのアーキテクチャーを示す環境変数で、要するに「俺のMac、インテルの64bit版ですわ」ということを説明してくれるやつね。

という結論に辿り着いたのは、この記事のおかげ。それで以下のコマンドを試してみました。

$ ARCHFLAGS="-arch x86_64" gem install nokogiri -v 1.5.11 -- --use-system-libraries --with-iconv-dir="$(brew --prefix libiconv)" --with-xml2-config="$(brew --prefix libxml2)/bin/xml2-config" --with-xslt-config="$(brew --prefix libxslt)/bin/xslt-config"

これでインストールは成功…するんだけど、バージョンが1.5.11ではRailsのDependencyを解決できずに、結局同じようにエラー吐いて終了してしまいます。

ちなみにARCHFLAGSは、.bash_profileとか、.zshrcとかに、

export ARCHFLAGS="-arch x86_64"

と記述しておくのが吉。

結局

rubyのバージョン落とすことで対応しました…。この恨み、いつか晴らすぞ、Nokogiri!

$ rbenv install 2.1.6
$ rbenv local 2.1.6
$ gem install rails

これで、railsの4.2.4がインストールされました。了!(了?)

参考リンク