[Ruby][備忘録]pikでインストールしたRubyでbundle exec rubyしたらエラーになった
解決編 - http://d.hatena.ne.jp/kk_Ataka/20111129/1322569582:title
あらすじ
- デフォルトのRubyからpikでインストールしたRubyに切り替えた後bundle exec rubyをしたら下記のようなエラーが出た
$ bundle exec ruby app.rb
ruby: invalid switch in RUBYOPT: -a (RuntimeError)
ン? なんだこれ。
調査
- pikでインストールしたRubyはバージョン等関係なしにことごとくこけた
- 1.8.7 patch352
- 1.9.3
- デフォルトでインストールしたRubyでは無事起動した / 下記ログ
- 1.8.7 patch330
$ bundle exec ruby app.rb
[2011-11-28 19:31:55] INFO WEBrick 1.3.1
[2011-11-28 19:31:55] INFO ruby 1.8.7 (2010-12-23) [i386-mswin32]
== Sinatra/1.3.1 has taken the stage on 4567 for development with backup from WEBrick
[2011-11-28 19:31:55] INFO WEBrick::HTTPServer#start: pid=964 port=4567
1.8.7同士でもこけたのと成功したのに分かれたので、gemが足りないのかなーとか思ったが、Bundlerでgem installし、ソースではgemを使っていないプロジェクトを作ってもダメだった。同じエラーだー。
$ mkdir sample
$ cd sample
Gemfile作成。
source :rubygems
source "http://rubygems.org"
gem 'pit' # 適当に
test.rb作成。
puts "Hello World!"
実行…。
$ bundle install ./vendor/bundle
$ bundle exec ruby test.rb
ruby: invalid switch in RUBYOPT: -a (RuntimeError)
bundleを使わなければ通る。
$ ruby test.rb
Hello World!
bundle exec rubyでこけてるのかなー?
ふりだしに戻る
よくわからないので、初めのエラーメッセージに帰ってみる。Rubyの-aオプションってなんだろう。
\`-n'や\`-p'とともに用いて, オートスプリットモードをONにします。オートスプリットモードでは各ループの先頭で, $F = $\_.split が実行されます。\`-n'か\`-p'オプションが同時に指定されない限り, このオプションは意味を持ちません。
nとpが出てきたな。
このフラグがセットされるとプログラム全体が sed -nやawk のように while gets ... end で囲まれているように動作します. -nフラグとほぼ同じですが, 各ループの最後に変数 $\_ の値を出力するようになります。 例: % echo matz | ruby -p -e '$\_.tr! "a-z", "A-Z"' MATZ
??? 今回のエラーとどうつながっているんだろう?
他に違う点がないか調べる
オプションがどんな原因に結びついているかわからなかったので、デフォルトRubyとpikRubyの相違点を探してみる事に。
- パッチバージョンが違っていた
- インストールパスが違っていた
インストールパスかぁ。%USERPROFILE%/.pik/config.ymlにインストール先の定義が書いてあったのを見つけた。Ruby1.8.7 330が自分で入れたRubyで1.8.7 352と1.9.3がpikで入れたRuby。
---
"187: ruby 1.8.7 (2010-12-23 patchlevel 330) [i386-mswin32]":
:path: !ruby/object:Pathname
path: C:/ruby/bin
"187: ruby 1.8.7 (2011-06-30 patchlevel 352) [i386-mingw32]":
:path: !ruby/object:Pathname
path: C:/Documents and Settings/USERNAME/.pik/rubies/Ruby-187-p352/bin
"193: ruby 1.9.3p0 (2011-10-30) [i386-mingw32]":
:path: !ruby/object:Pathname
path: C:/Documents and Settings/USERNAME/.pik/rubies/Ruby-193-p0/bin
--- {}
並べて見てみると”Documents and Settings”が何か非常にイヤ~な感じだったのでちょっと動かしてみた。
---
"187: ruby 1.8.7 (2010-12-23 patchlevel 330) [i386-mswin32]":
:path: !ruby/object:Pathname
path: C:/ruby/bin
"187: ruby 1.8.7 (2011-06-30 patchlevel 352) [i386-mingw32]":
:path: !ruby/object:Pathname
path: C:/rubies/Ruby-187-p352/bin
"193: ruby 1.9.3p0 (2011-10-30) [i386-mingw32]":
:path: !ruby/object:Pathname
path: C:/Documents and Settings/USERNAME/.pik/rubies/Ruby-193-p0/bin
--- {}
Cドライブ直下に移動。さて…
$ bundle exec ruby test.rb
Hello World!
!? うーん動いた…。
一旦まとめ
- インストールディレクトリにProgram FilesとかDocuments and Settingsみたいなスペースが入っているパスを使わない
で、一旦解決という事で。。。根本的な原因はわからなかった。BundlerとPikのページでも見たら何かひらめくだろうか。pikのデフォルトディレクトリ変えたいなー。