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を調べてみる
とりあえずbundle
がrbenv
じゃなくてシステムのRubyを参照していると思ったので、which
で調べてみることに。
$ which bundle
/usr/bin/bundle
なるほど、bundle
はここにあるんですね。
/usr/bin/bundleをcatしてみる
で、次にこれをcat
してみました。
すると、1行目にこうありました。
#!/usr/bin/ruby
これはシステムのデフォルトを参照してますよ、ということですね。 なので、これをとりあえず以下に変えてみました(対処が適当すぎる)。
#!/usr/local/rbenv/shims/ruby
もちろんうまくいかず。
bundleの場所を疑う
で、いろいろ調べるうちに「bundle
もgem
でインストールしたんだから、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
が入らなかったのか、今から調査します。。。