ztbuz@dev

人生に絶望しているZが、それでも技術を身につけようと必死になるブログ

rbenv環境下でbundle installしたときにRubyのバージョンがおかしい場合の対処例

足かけ2日ハマり、最後はstackoverflowでロシア人の方に丁寧に手ほどきされながら解決を迎えることができました。

問題の発端

Rails環境を構築していて、試しにbundle installを実行すると、以下のようなメッセージが表示されました。

Your Ruby version is 1.8.7, but your Gemfile specified 2.0.0

え、でもrbenvでちゃんとインストールしたしぃ……と思い、ruby -vを実行すると、やっぱりちゃんとインストールされてる。 どや。

$ ruby -v
ruby 2.0.0p353 (2013-11-22 revision 43784) [x86_64-linux]

ちなみに、Rubyのシステムのデフォルトは以下のとおり。

$ sudo ruby -v
ruby 1.8.7 (2011-06-30 patchlevel 352) [x86_64-linux]

なので、早い段階でbundle installがシステムのデフォルトを参照してるのでは? というあたりはついていました。

解決策

bundleが参照しているrubyを調べてみる

とりあえずbundlerbenvじゃなくてシステムのRubyを参照していると思ったので、whichで調べてみることに。

$ which bundle
/usr/bin/bundle

なるほど、bundleはここにあるんですね。

/usr/bin/bundleをcatしてみる

で、次にこれをcatしてみました。 すると、1行目にこうありました。

#!/usr/bin/ruby

これはシステムのデフォルトを参照してますよ、ということですね。 なので、これをとりあえず以下に変えてみました(対処が適当すぎる)。

#!/usr/local/rbenv/shims/ruby

もちろんうまくいかず。

bundleの場所を疑う

で、いろいろ調べるうちに「bundlegemでインストールしたんだから、rbenv下にインストールされるはずでは?」「もしかしたらbundle自体がうまくインストールされてないんじゃ……」と思い、調べてみることに。

$ gem list

*** LOCAL GEMS ***

bigdecimal (1.2.0)
io-console (0.4.2)
json (1.7.7)
minitest (4.3.2)
psych (2.0.0)
rake (0.9.6)
rdoc (4.0.0)
test-unit (2.0.0.0)

……。 bundlerがない!

試しにシステムのデフォルトを見てみると、もちろんbundlerはありました。

$ sudo gem list

*** LOCAL GEMS ***

bundler (1.3.5)
json (1.5.5)

bundleを入れなおす

ということなので、改めてbundlerを入れなおします。

$ su
$ gem install bundler
$ rbenv rehash

で、gem listをしてみると、

$ gem list

*** LOCAL GEMS ***

bigdecimal (1.2.0)
bundler (1.3.5)
io-console (0.4.2)
json (1.7.7)
minitest (4.3.2)
psych (2.0.0)
rake (0.9.6)
rdoc (4.0.0)
test-unit (2.0.0.0)

あったー!

which bundleしてみると、

$ which bundle
/usr/local/rbenv/shims/bundle

はいったー!

bundle installしてみると、

$ bundle install

(省略)

できたー! おしまい。

補足:なぜシステムの方が使われた?

環境設定のパスを見てみると、次のようになってます。

$ echo $PATH
/usr/local/rbenv/shims:/usr/local/rbenv/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/vagrant/bin

これは左から優先順に適用されます。 つまり、rbenv/shims下になかったので、usr/bin/下のbundleが実行されていたのですね。

とりあえず、なんでChef Soloでレシピを書いているにも関わらずbundlerが入らなかったのか、今から調査します。。。