pikでインストールしたRubyでbundle exec rubyしたらエラーになった

[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'オプションが同時に指定されない限り, このオプションは意味を持ちません。

http://doc.ruby-lang.org/ja/1.8.7/doc/spec=2frubycmd.html

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のデフォルトディレクトリ変えたいなー。

関連記事(この記事の初版より古い記事はリンクがグレーで表示されます)

  1. 2011/12/27 [Evernote] [Ruby] [API] EvernoteのAPIをRubyから叩きたい
  2. 2011/12/26 [Ruby] [Haml] [Sinatra] SinatraでHaml入門
  3. 2011/12/21 [Ruby] Ruby実行時のオプションをよろしく解析してくれるoptparseを使ってみる
  4. 2011/12/15 [Ruby] [Solaris] [Redmine] RedmineとApacheを連携させるPassengerをインストールできなかった
  5. 2011/12/07 [Ruby] ZenTestでRSpecを自動実行できるようにした
  6. 2011/12/05 [Ruby] [Redmine] RedmineでプラグインインストールしたらTemplateErrorが出た
  7. 2011/12/04 [Ruby] [Mac] [Unix] 複数のRuby環境の管理・切替ができるrvmをインストールした
  8. 2011/11/30 [Ruby] [Heroku] rvm環境でRuby実行時にReadlineエラーが起きた時の対処法
  9. 2011/11/29 [Ruby] pikでインストールしたRubyでbundle exec rubyしたらエラーになった 解決編
  10. 2011/11/27 [Ruby] [Heroku] [Lokka] LokkaをインストールしてHerokuにデプロイした
  11. 2011/11/26 [Ruby] [Sinatra] [Heroku] HerokuにWebアプリ(Sinatra)をデプロイする手順をまとめた
  12. 2011/11/24 [Ruby] 複数のRuby環境の管理・切替ができるpikを実行できた nyaos編
  13. 2011/10/04 [Ruby] 複数のRuby環境の管理・切替ができるpikを実行できた
  14. 2011/10/03 [Ruby] Rubyのgemバージョン管理ができるBundlerを実行できなかった
  15. 2011/09/30 [Java] [Windows] [Ruby] .msgファイルをパースして中から添付ファイルを抜き出す