nokogiriがgem installできるけどbundle installできない


# bundle installでnokogiriがインストールできない

環境
RubyonRails 4.2.6
ruby 2.3.1

rubyはrbenv使用

bundle installすると

```
Installing nokogiri 1.6.6.2 with native extensions

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

    /System/Library/Frameworks/Ruby.framework/Versions/2.3/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.3.0.
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.3/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.3.0/gems/nokogiri-1.6.6.2 for inspection.
Results logged to /Path/to/.bundler/ruby/2.3.0/gems/nokogiri-1.6.6.2/ext/nokogiri/gem_make.out
An error occurred while installing nokogiri (1.6.6.2), and Bundler cannot continue.
Make sure that `gem install nokogiri -v '1.6.6.2'` succeeds before bundling.
```


こんな感じのエラーが出る。

## 解決法を見つけるべくサイトを漁る

[Mac OS X Mavericksで”gem i nokogiri”失敗の解決方法](https://qiita.com/t_732_twit/items/a7956a170b1694f7ffc2)
[nokogiri を嫌いにならないで 〜インストール時のエラーを乗り越えろ〜](https://qiita.com/dskst/items/b1f073fcffeca3bc9fc6)

を参考に色々と悩むが解決できず。

## gem install nokogiri -v '1.6.6.2'をしてみる

**なんかうまくいってる・・・**

**でもbundle installの結果は変わらず**

ここで途方にくれる。gem installで成功したらbundle installも成功するんじゃないの？？？べつなの？？？？


## gem installするときとbundle installするときでインストール先が違うのか？？

**which nokogiri**
/.rbenv/shims/nokogiri
 
**which gem**
/.rbenv/shims/gem

gem installすると/.rbenv/shims以下に保存されることはわかっている。
gem installはできるのにbundle installはできないということはそれぞれ参照している場所が違うんだろうなぁ・・・
確認します

**gem environment**

参照するgemのpathは
```
.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0
```

gem installするところと参照するgemの場所は違うみたい。

bundle install すると、.rbenv/versions/2.3.0/lib/ruby/gems/以下に保存される。


なので、gem installができてもbundle installができないということが起こる。


## bundlerというgemの存在

bundle installによってgemがインストールされる際、bundlerというgemを使用してインストールしている。

### bundlerって何してくれるの？

gemは、基本的にrubyのバージョンごとに一つ。
なので複数のプロジェクトで、同じrubyのバージョンを使っていると競合が起きたりする

そういう時のためにbundlerはgemをプロジェクトごとに管理してくれる。これによって競合が起きにくくなるのでものすごく便利。

### bundlerの利点を活かせてなかったが故にエラーが起きた

bundlerを使ったbundle installでは、gemをプロジェクトごとに管理してくれると上で述べたが、自分のbundlerはプロジェクトごとに管理できていなかった。

プロジェクトごとに管理するためには、**bundle install --path vendor/bundle**と打ってbundle installする必要がある。
一度でもこれを打っていると、以降bundle installすると 自動で--path vendor/bundleをつけてくれるようになるので省略可。

これを打っておかないと、bundlerの利点を生かしたプロジェクトごとにgemを管理できないので、打っておこう。

bundle configを打つと、どこにbundle installされるかわかる。
```
Set for your local app (/Users/*****/projects/*****/.bundle/config): "vendor/bundle"
```
となっていればプロジェクトごとにgem管理が可能。


## bundle install --path vendor/bundleしたらnokogiriもbundle install通るようになった

今回の原因は、**プロジェクトごとにgemを管理していなかったためにnokogiriが競合を起こしbundle installがエラーが起きた**
というもの。

なので、nokogiriが競合を起こさないように bundle install --path vendor/bundleしたらうまくいった。

## 競合の解決ができたわけではない。

結局はAの場所にnokogiri入れると競合起こすからBの場所にnokogiri入れよう
という形で解決しただけなので、Aの場所にnokogiriを入れようとすると変わらずエラーが起きる。
これも原因究明したいところだが、あまり時間をかけても勿体無いので今回はスルーで。


## 今後気をつけたいこと
1. gem installとbundle installでは保存する場所が違うこと。 
2. bundle installはbundle install --path vendor/bundleを一回でもしていないと利点を活かせない
3. おまけ　sudo bundle installやsudo gem installもインストール場所が違うのでしてしまうと混乱する [参考サイト](http://ruby.studio-kingdom.com/bundler/bundle_install/#sudo_usage)