nokogiri を嫌いにならないで 〜インストール時のエラーを乗り越えろ〜

`$ bundle install` での nokogiri のインストールエラーがよく起きるようです。
nokogiri のインストールエラー系の記事を調べ尽くしたくらいハマり、ほぼ全部の対応をやりましたが最終的には `brew doctor` の指示で解消されました。
記載している対応方法はどれも実際に解消されている人もいるので、一個ずつ試していったら良いかと思います。

最初に発生したエラーは下記になります。

```
Installing nokogiri 1.6.7.rc4 with native extensions

Gem::Installer::ExtensionBuildError: ERROR: Failed to build gem native extension.

    /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/ruby extconf.rb
checking if the C compiler accepts ... yes
checking if the C compiler accepts -Wno-error=unused-command-line-argument-hard-error-in-future... no
Building nokogiri using packaged libraries.
Using mini_portile version 2.0.0.rc2
checking for iconv.h... yes
checking for gzdopen() in -lz... yes
checking for iconv... no
-----
libiconv is missing.  Please locate mkmf.log to investigate how it is failing.
-----
*** 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=/System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/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


Gem files will remain installed in /Path/to/.bundler/ruby/2.0.0/gems/nokogiri-1.6.7.rc4 for inspection.
Results logged to /Path/to/.bundler/ruby/2.0.0/gems/nokogiri-1.6.7.rc4/ext/nokogiri/gem_make.out
An error occurred while installing nokogiri (1.6.7.rc4), and Bundler cannot continue.
Make sure that `gem install nokogiri -v '1.6.7.rc4'` succeeds before bundling.
```


## 環境

* OSX Yosemite 10.10.5
* `$ brew --version`  
0.9.5 (git revision 7cfd3e61; last commit 2015-11-27)
* `$ ruby --version`  
ruby 2.0.0p481 (2014-05-08 revision 45883) [universal.x86_64-darwin14]
* `gem --version`  
2.0.14

## nokogiri インストールするためにやったこと

### 事前準備

#### nokogiri で必要なパッケージをインストール

libxml2, libxslt, libiconv が必要なので brew でインストールします。
※ 成功の箇所に記載していますが、 link はいらないのかも。結局私は unlink するとインストールできましたが、複合的な要因がありそうなので一応メジャーなやり方を書いています。

```
$ brew tap homebrew/dupes
$ brew install libxml2 libxslt libiconv
$ brew link --force libxml2 libxslt libiconv
```

正常にインストールされたか確認。  

```
$ xml2-config --version
2.9.3
$ xslt-config --version
1.1.28
$ iconv --version
iconv (GNU libiconv 1.14)
```

ちなみに、私の環境は `/opt/local/bin` （macportsのパッケージ）が優先パスになっており、そちらにも同じパッケージが入っていて少しはまっていました。
brew は `/usr/local/bin` にシンボリックリンクを作成するので、そこを優先PATHにします。

### 1. `--use-system-libraries` を設定してみた

まずはメジャーな対応です。

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

**結果は失敗**
今度は libxml2 でエラーが。

```
libxml2 is missing.  Please locate mkmf.log to investigate how it is failing.
```

### 2. xml2-config, xslt-config を指定してみた

config を直接指定。
オプション例にはこんなオプションないのですが、やっている記事があったのでやってみました。

```
$ bundle config build.nokogiri \
    --use-system-libraries \
    --with-xml2-config=/usr/local/bin/xml2-config \
    --with-xslt-config=/usr/local/bin/xslt-config
$ bundle install
```

**結果は失敗**
変化なし！

```
libxml2 is missing.  Please locate mkmf.log to investigate how it is failing.
```

### 3. Xcode の libxml を指定してみた

参考:
http://stackoverflow.com/questions/19643153/error-to-install-nokogiri-on-osx-10-9-maverick
http://qiita.com/mist_dev/items/be2efa5913fa0fc861af

```
bundle config build.nokogiri \
  --use-system-libraries \
  --with-xml2-include=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/usr/include/libxml2/libxml
```

**結果は失敗**

```
Gem::Installer::ExtensionBuildError: ERROR: Failed to build gem native extension.

    /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/ruby extconf.rb --use-system-libraries --with-xml2-include=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/usr/include/libxml2/libxml
checking if the C compiler accepts ... yes
checking if the C compiler accepts -Wno-error=unused-command-line-argument-hard-error-in-future... no
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-libexslt-config


Gem files will remain installed in /var/folders/z8/5vc_44kj15zd8zdsrb0z3th80000gn/T/bundler20151129-14117-10ziz4wnokogiri-1.6.7.rc4/gems/nokogiri-1.6.7.rc4 for inspection.
Results logged to /var/folders/z8/5vc_44kj15zd8zdsrb0z3th80000gn/T/bundler20151129-14117-10ziz4wnokogiri-1.6.7.rc4/gems/nokogiri-1.6.7.rc4/ext/nokogiri/gem_make.out
An error occurred while installing nokogiri (1.6.7.rc4), and Bundler cannot continue.
Make sure that `gem install nokogiri -v '1.6.7.rc4'` succeeds before bundling.
```

### 3. lib と include ディレクトリを指定してみた

参考:
http://www.nokogiri.org/tutorials/installing_nokogiri.html#freebsd

```
bundle config build.nokogiri \
    --use-system-libraries \
    --with-xml2-lib=/usr/local/lib \
    --with-xml2-include=/usr/local/include/libxml2/libxml \
    --with-xslt-lib=/usr/local/lib \
    --with-xslt-include=/usr/local/include/libxslt \
    --with-iconv-lib=/usr/local/lib \
    --with-iconv-include=/usr/local/include
```

**結果は失敗**

```
sh: -c: line 0: unexpected EOF while looking for matching `''
sh: -c: line 1: syntax error: unexpected end of file

Gem::Installer::ExtensionBuildError: ERROR: Failed to build gem native extension.

    /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/ruby extconf.rb '--use-system-libraries --with-xml2-lib=/usr/local/lib --with-xml2-include=/usr/local/include/libxml2/libxml --with-xslt-lib=/usr/local/lib --with-xslt-include=/usr/local/include/libxslt --with-iconv-lib=/usr/local/lib


Gem files will remain installed in /var/folders/z8/5vc_44kj15zd8zdsrb0z3th80000gn/T/bundler20151129-14696-nm7tqmnokogiri-1.6.7.rc4/gems/nokogiri-1.6.7.rc4 for inspection.
Results logged to /var/folders/z8/5vc_44kj15zd8zdsrb0z3th80000gn/T/bundler20151129-14696-nm7tqmnokogiri-1.6.7.rc4/gems/nokogiri-1.6.7.rc4/ext/nokogiri/gem_make.out
An error occurred while installing nokogiri (1.6.7.rc4), and Bundler cannot continue.
Make sure that `gem install nokogiri -v '1.6.7.rc4'` succeeds before bundling.
```

### 4. lib と include ディレクトリを変数で指定してみた

```
$ bundle config build.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"
```

**結果は失敗**

```
libxml2 is missing.  Please locate mkmf.log to investigate how it is failing.
```

### 5. gem で入れてみようとする

```
$ sudo NOKOGIRI_USE_SYSTEM_LIBRARIES=1 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"
```

**結果は失敗**

```
libxml2 is missing.  Please locate mkmf.log to investigate how it is failing.
```

### 6. macports をアンインストールしてみた

brew でインストールしたパッケージと競合とかしていたので。

参考：
http://macperson.net/macports-uninstall/

**結果は変化なし**
うん、、何も変わりませんでした。

### 7. Xcode のパッケージで全部指定

参考:
http://stackoverflow.com/questions/6277456/nokogiri-installation-fails-libxml2-is-missing

```
bundle config build.nokogiri \
  --use-system-libraries \
  --with-xml2-include=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/usr/include/libxml2/libxml \
  --with-xml2-lib=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/usr/lib \
  --with-iconv-include=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/usr/include \
  --with-iconv-lib=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/usr/lib
```  

**結果は失敗**
エラーメッセージをメモするのを忘れましたが、失敗しました。

### 8. gem nokogiri をアンインストール

どこかの記事にあったローカルの nokogiri を削除すれといった内容。

```
$ sudo gem uninstall nokogiri
ERROR:  While executing gem ... (Gem::InstallError)
    nokogiri is not installed in GEM_HOME, try:
	gem uninstall -i /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/gems/2.0.0 nokogiri
```
```
$ sudo gem uninstall -i /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/gems/2.0.0 nokogiri
Remove executables:
	nokogiri

in addition to the gem? [Yn]  Y
Removing nokogiri
Successfully uninstalled nokogiri-1.5.6
```

**結果は失敗**
何も変わりませんでした。

### 9. `brew doctor` をしてみた（nokogiriインストールに成功）

brew でパッケージが正常にインストールできていないのかと思い、 `brew doctor` をしてみたら、libiconv とかでエラーがでてました。
指示の通り `brew unlink` をそれぞれ行いました。

```
$ brew doctor
Please note that these warnings are just used to help the Homebrew maintainers
with debugging if you file an issue. If everything you use Homebrew for is
working fine: please don't worry and just ignore them. Thanks!

Warning: Some keg-only formula are linked into the Cellar.
Linking a keg-only formula, such as gettext, into the cellar with
`brew link <formula>` will cause other formulae to detect them during
the `./configure` step. This may cause problems when compiling those
other formulae.

Binaries provided by keg-only formulae may override system binaries
with other strange results.

You may wish to `brew unlink` these brews:
    homebrew/dupes/libiconv
    libxml2
    libxslt
```

**結果は大成功！！**

nokogiri のための config 設定を何もしない状態でインストールできました！

```
$ bundle config
Settings are listed in order of priority. The top value will be used.
$ bundle install
Installing nokogiri 1.6.7.rc4 with native extensions
Bundle complete!
```

色々とやり過ぎてよくわからなくなっているが、以下が原因だったんでしょうか。

* macports でパッケージが競合していた
* brew でインストールした際になんかおかしくなった

## 疲れた

色々調べまくりつかれました。
正直 nokogiri が嫌いになりそうでした。便利なんですけどね、こんなにハマると辛かったです。

nokogori のインストールにハマっているという人達が、少しでもこの記事で救われれば幸いです。

## その他： `bundle install` でのバーミッションエラー

私はどこかで sudo で何かをやったようで、以下パーミッションエラーでもハマりました。
`/Library/Ruby/Gems/2.0.0/bundler/gems` 配下の対象ディレクトリ別名にするなどで退避すると解消されましたが、それが正解かは不明です。
参考まで。

```
error: cannot open .git/FETCH_HEAD: Permission denied

Retrying git fetch --force --quiet --tags "/Users/whoami/.bundler/cache/git/fastlane_core-736319f988b46dd2ce999c7e428ab29293f12d53" due to error (2/4): Bundler::Source::Git::GitCommandError Git error: command `git fetch --force --quiet --tags "/Users/whoami/.bundler/cache/git/fastlane_core-736319f988b46dd2ce999c7e428ab29293f12d53"` in directory /Library/Ruby/Gems/2.0.0/bundler/gems/fastlane_core-aef11ae30b25 has failed.
If this error persists you could try removing the cache directory '/Users/whoami/.bundler/cache/git/fastlane_core-736319f988b46dd2ce999c7e428ab29293f12d53'
error: cannot open .git/FETCH_HEAD: Permission denied

Retrying git fetch --force --quiet --tags "/Users/whoami/.bundler/cache/git/fastlane_core-736319f988b46dd2ce999c7e428ab29293f12d53" due to error (3/4): Bundler::Source::Git::GitCommandError Git error: command `git fetch --force --quiet --tags "/Users/whoami/.bundler/cache/git/fastlane_core-736319f988b46dd2ce999c7e428ab29293f12d53"` in directory /Library/Ruby/Gems/2.0.0/bundler/gems/fastlane_core-aef11ae30b25 has failed.
If this error persists you could try removing the cache directory '/Users/whoami/.bundler/cache/git/fastlane_core-736319f988b46dd2ce999c7e428ab29293f12d53'
error: cannot open .git/FETCH_HEAD: Permission denied

Retrying git fetch --force --quiet --tags "/Users/whoami/.bundler/cache/git/fastlane_core-736319f988b46dd2ce999c7e428ab29293f12d53" due to error (4/4): Bundler::Source::Git::GitCommandError Git error: command `git fetch --force --quiet --tags "/Users/whoami/.bundler/cache/git/fastlane_core-736319f988b46dd2ce999c7e428ab29293f12d53"` in directory /Library/Ruby/Gems/2.0.0/bundler/gems/fastlane_core-aef11ae30b25 has failed.
If this error persists you could try removing the cache directory '/Users/whoami/.bundler/cache/git/fastlane_core-736319f988b46dd2ce999c7e428ab29293f12d53'
error: cannot open .git/FETCH_HEAD: Permission denied

Git error: command `git fetch --force --quiet --tags "/Users/whoami/.bundler/cache/git/fastlane_core-736319f988b46dd2ce999c7e428ab29293f12d53"` in directory
/Library/Ruby/Gems/2.0.0/bundler/gems/fastlane_core-aef11ae30b25 has failed.
If this error persists you could try removing the cache directory '/Users/whoami/.bundler/cache/git/fastlane_core-736319f988b46dd2ce999c7e428ab29293f12d53'
```