2018年以降の記事はGitHub Pagesに移行しました

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

解決編 - pikでインストールしたRubyでbundle exec rubyしたらエラーになった 解決編 - kk_Atakaの日記

あらすじ

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