Railsでnokogiriのインストールが出来ない


##はじめに
`rails`で`nokogiri`を使ってスクレイピングをしようと思い`gem`をインストールしましたが上手く出来ずハマったので紹介します。

##現象
`nokogiri`の`gem`インストールは無事出来たと思っていましたが、`requier`するとエラーになってしまい使えませんでした。
調べてみると`nokogiri`は色々な`gem`が依存しているようです。`homebrew`から`libiconv formula`が削除されてしまってビルドに失敗するケースなどがあるそうです。
今回は色々試してみて途中に色々エラーが出ました。
ざっと紹介したいと思います。

```bash:入力コマンド
$ gem install nokogiri
```
```bash:出力結果
Building native extensions.  This could take a while...
Building nokogiri using packaged libraries.
ERROR:  Error installing nokogiri:
	ERROR: Failed to build gem native extension.

    /Users/user/.rbenv/versions/2.0.0-p247/bin/ruby -r ./siteconf20141013-14762-qxfygt.rb extconf.rb
Building nokogiri using packaged libraries.
checking for iconv.h... yes
checking for iconv_open() in iconv.h... no
checking for iconv_open() in -liconv... no
checking for libiconv_open() in iconv.h... no
checking for libiconv_open() in -liconv... no
-----
libiconv is missing.  please visit http://nokogiri.org/tutorials/installing_nokogiri.html for help with installing dependencies.
-----
*** 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.

Provided configuration options:
	--with-opt-dir
	--without-opt-dir
	--with-opt-include
	--without-opt-include=${opt-dir}/include
	--with-opt-lib
	--without-opt-lib=${opt-dir}/lib
	--with-make-prog
	--without-make-prog
	--srcdir=.
	--curdir
	--ruby=/Users/user/.rbenv/versions/2.0.0-p247/bin/ruby
	--help
	--clean
	--use-system-libraries
	--enable-static
	--disable-static
    --with-zlib-dir
	--without-zlib-dir
	--with-zlib-include
	--without-zlib-include=${zlib-dir}/include
	--with-zlib-lib
	--without-zlib-lib=${zlib-dir}/lib
	--enable-cross-build
	--disable-cross-build

extconf failed, exit code 1

Gem files will remain installed in /Users/user/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/nokogiri-1.6.3.1 for inspection.
Results logged to /Users/user/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/extensions/x86_64-darwin-12/2.0.0-static/nokogiri-1.6.3.1/gem_make.out
```

```bash:入力コマンド
$ bundle install
```

```bash:出力結果
Fetching gem metadata from https://rubygems.org/.........
Resolving dependencies...
Using rake 10.3.2
Using i18n 0.6.11
Using json 1.8.1
Using minitest 5.4.2
Using thread_safe 0.3.4
Using tzinfo 1.2.2
Using activesupport 4.1.4
Using builder 3.2.2
Using erubis 2.7.0
Using actionview 4.1.4
Using rack 1.5.2
Using rack-test 0.6.2
Using actionpack 4.1.4
Using mime-types 1.25.1
Using polyglot 0.3.5
Using treetop 1.4.15
Using mail 2.5.4
Using actionmailer 4.1.4
Using activemodel 4.1.4
Using arel 5.0.1.20140414130214
Using activerecord 4.1.4
Using bundler 1.6.5
Using coffee-script-source 1.8.0
Using execjs 2.2.1
Using coffee-script 2.3.0
Using thor 0.19.1
Using railties 4.1.4
Using coffee-rails 4.0.1
Using hike 1.2.3
Using multi_json 1.10.1
Using jbuilder 2.2.2
Using jquery-rails 3.1.2
Using mini_portile 0.6.0
Building nokogiri using system libraries.

Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

    /Users/user/.rbenv/versions/2.0.0-p247/bin/ruby -r ./siteconf20141013-14847-1g83srl.rb extconf.rb --use-system-libraries
Building nokogiri using system libraries.
libxml2 version 2.6.21 or later is required!
*** 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.

Provided configuration options:
	--with-opt-dir
	--without-opt-dir
	--with-opt-include
	--without-opt-include=${opt-dir}/include
	--with-opt-lib
	--without-opt-lib=${opt-dir}/lib
	--with-make-prog
	--without-make-prog
	--srcdir=.
	--curdir
	--ruby=/Users/user/.rbenv/versions/2.0.0-p247/bin/ruby
	--help
	--clean
	--use-system-libraries
	--with-zlib-dir
	--without-zlib-dir
	--with-zlib-include
	--without-zlib-include=${zlib-dir}/include
	--with-zlib-lib
	--without-zlib-lib=${zlib-dir}/lib
	--with-xml2-dir
	--without-xml2-dir
	--with-xml2-include
	--without-xml2-include=${xml2-dir}/include
	--with-xml2-lib
	--without-xml2-lib=${xml2-dir}/lib
	--with-libxml-2.0-config
	--without-libxml-2.0-config
	--with-pkg-config
	--without-pkg-config
	--with-xslt-dir
	--without-xslt-dir
	--with-xslt-include
	--without-xslt-include=${xslt-dir}/include
	--with-xslt-lib
	--without-xslt-lib=${xslt-dir}/lib
	--with-libxslt-config
	--without-libxslt-config
	--with-pkg-config
	--without-pkg-config
	--with-exslt-dir
	--without-exslt-dir
	--with-exslt-include
	--without-exslt-include=${exslt-dir}/include
	--with-exslt-lib
	--without-exslt-lib=${exslt-dir}/lib
	--with-libexslt-config
	--without-libexslt-config
	--with-pkg-config
	--without-pkg-config

extconf failed, exit code 1

Gem files will remain installed in /Users/user/Documents/study/rails/igr_times/vendor/bundle/ruby/2.0.0/gems/nokogiri-1.6.3.1 for inspection.
Results logged to /Users/user/Documents/study/rails/igr_times/vendor/bundle/ruby/2.0.0/extensions/x86_64-darwin-12/2.0.0-static/nokogiri-1.6.3.1/gem_make.out
An error occurred while installing nokogiri (1.6.3.1), and Bundler cannot continue.
Make sure that `gem install nokogiri -v '1.6.3.1'` succeeds before bundling.
```

```bash:入力コマンド
gem install nokogiri -v '1.6.3.1'
```

```bash:出力結果
Building native extensions.  This could take a while...
Building nokogiri using packaged libraries.
Building libxml2-2.8.0 for nokogiri with the following patches applied:
	- 0001-Fix-parser-local-buffers-size-problems.patch
	- 0002-Fix-entities-local-buffers-size-problems.patch
	- 0003-Fix-an-error-in-previous-commit.patch
	- 0004-Fix-potential-out-of-bound-access.patch
	- 0005-Detect-excessive-entities-expansion-upon-replacement.patch
	- 0006-Do-not-fetch-external-parsed-entities.patch
	- 0007-Enforce-XML_PARSER_EOF-state-handling-through-the-pa.patch
	- 0008-Improve-handling-of-xmlStopParser.patch
	- 0009-Fix-a-couple-of-return-without-value.patch
	- 0010-Keep-non-significant-blanks-node-in-HTML-parser.patch
	- 0011-Do-not-fetch-external-parameter-entities.patch
************************************************************************
IMPORTANT!  Nokogiri builds and uses a packaged version of libxml2.

If this is a concern for you and you want to use the system library
instead, abort this installation process and reinstall nokogiri as
follows:

    gem install nokogiri -- --use-system-libraries

If you are using Bundler, tell it to use the option:

    bundle config build.nokogiri --use-system-libraries
    bundle install

However, note that nokogiri does not necessarily support all versions
of libxml2.

For example, libxml2-2.9.0 and higher are currently known to be broken
and thus unsupported by nokogiri, due to compatibility problems and
XPath optimization bugs.
************************************************************************
```

では最終的に行なったことをまとめたいと思います。

##必須ファイルの導入
以下のコマンドを実行して必須ファイルを導入を行います。

```bash:入力コマンド
$ brew tap homebrew/dupes                   #リポジトリの追加
$ brew install libxml2 libxslt libiconv     #必須ファイルのインストール
$ brew link --force libxml2
$ brew link --force libxslt
$ brew link --force libiconv
```

これで`gem`インストール。

```bash:入力コマンド
$ gem install nokogiri -- --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"
```

インストール完了。と思ったのですが、上手く行かず...。

##いろいろ試した（失敗例？）
記事を漁っていろいろしてみました。
途中でこのようなコマンドを実行。

```bash:入力コマンド
$ NOKOGIRI_USE_SYSTEM_LIBRARIES=1 gem install nokogiri --no-rdoc --no-ri
```

その他こんなコマンドも。

```bash:入力コマンド
bundle config build.nokogiri --use-system-libraries
```

```bash:出力結果一部
...
Building nokogiri using system libraries.
...
```

結果的にインストール済みのlibxml2を使う様に指定はされているようでしたが、libxml2が無いと言われて上手く行きませんでした。

また途中`bundle install`時にパスを指定して`bundle install --path vendor/bundle`としましたがダメでした。

##最終的に（私の場合）
最終的にあと一歩、自分の場合何が行けなかったのかというと、`bundle/config`の中身の変更でした。
というか途中でいじりすぎたせいですねorz
おそらく上記「必須ファイルの導入」をすればインストール出来たのだと思います。

自分の場合`bundle install --path vendor/bundle`をしたので`.bundle/config`の中に`BUNDLE_PATH: vendor/bundle`の設定がされてました。
途中もしやと思い、この設定を削除したら`bundle install`出来ました。

##おわりに
この解決に1日かけてしまったのでとてもショックでした。。。
でもなんだかんだ勉強になったので良かったです。
今回は以下の記事を主に参考にさせて頂きました。ありがとうございます。

>Mac OS X Mavericksで”gem i nokogiri”失敗の解決方法
>http://qiita.com/t_732_twit/items/a7956a170b1694f7ffc2

>nokogiriのインストールでハマった件
>http://heroween.hateblo.jp/entry/2014/05/25/164302

>Mac OS X Mavericks で bundle install した時 nokogiri が "libiconv is missing."でインストールできなかった
>http://qiita.com/niwatako/items/1fd769d679ea6cd9a476

>Installing Nokogiri
>http://www.nokogiri.org/tutorials/installing_nokogiri.html