Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

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”失敗の解決方法
nokogiri を嫌いにならないで 〜インストール時のエラーを乗り越えろ〜

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

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もインストール場所が違うのでしてしまうと混乱する 参考サイト
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした