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

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

前回までのあらすじ

pikでインストールしたRubyでbundle exec rubyしたらエラーになった - kk_Atakaの日記で出たRubyオプションのエラー。

$ bundle exec ruby app.rb
ruby: invalid switch in RUBYOPT: -a (RuntimeError)

この-aオプションはどこから出てきたのかというと、"Documents and Settings"のaだという事がわかった。

結論

  • Rubyのインストールパスにスペースを含めない
  • pikでRubyをインストールする前にpik config install_dir=XXXでパス指定する

先に結論を書くと、やっぱりこうだった。以下、調査ログ。

調査

試しに以下のディレクトリに設置したRubyを使用しようとしたところ、下記のエラーが。(whichとか使えてるのはnyaosを使っているからです)

  • C:\rubies\Ru by\
$ which ruby
C:\rubies\Ru by\bin\ruby.exe
$ bundle exec ruby myapp.rb
ruby: illegal switch in RUBYOPT: -b (RuntimeError)
  • C:\rubies\R uby\
$ which ruby
C:\rubies\R uby\bin\ruby.exe
$ bundle exec ruby myapp.rb
ruby: illegal switch in RUBYOPT: -u (RuntimeError)

あぁやっぱりかー。

pikの設定変更

という事は、pik install時にデフォルトでDocuments and Settingsに入れられるのは避けなければならん。pikのhistoryにそれっぽいことが書いてあった。

=== 0.2.8 / 2010-06-22

BACKWARD COMPATIBILITY CHANGE

pik will now install new rubies to %USERPROFILE%\rubies\, instead of %PIK_BIN%\pik\ this was necessary to all for installation into %PROGRAMFILES% dir. If you'd like to keep the old path, run:
>pik config install_dir=C:\path\to\pik

https://github.com/vertiginous/pik/blob/master/History.txt

なるほど。pik configコマンドでパスを指定するのか。

$ pik config install_dir=C:\rubies\
$ pik config
** CURRENT CONFIGURATION **

187: ruby 1.8.7 (2010-12-23 patchlevel 330) [i386-mswin32] *
     path: C:\rubies\Ruby\bin

** GLOBAL CONFIGURATION **

---
install_dir: C:\rubies\

install_dirがセットされた。次にinstall。Rubyはとりあえず1.9.1を指定。

$ pik install ruby 1.9.1
** Downloading:  http://rubyforge.org/frs/download.php/72076/ruby-1.9.1-p430-i386-mingw32.7z
   to:  C:\Documents and Settings\USERNAME\.pik\downloads\ruby-1.9.1-p430-i386-mingw32.7z

ruby-1.9.1-p430-i386-min...7z: 100% |oooooooooo|   4.7MB/  4.7MB Time: 00:01:11

** Extracting:  C:\Documents and Settings\USERNAME\.pik\downloads\ruby-1.9.1-p430-i386-mingw32.7z
   to:  C:\rubies\Ruby-191-p430
done

** Adding:  191: ruby 1.9.1p430 (2010-08-16 revision 28998) [i386-mingw32]
 Located at:  C:\rubies\Ruby-191-p430\bin

ダウンロードはUSERPROFILEか。でもインストール先はちゃんとinstall_dirになってる。

$ pik list
* 187: ruby 1.8.7 (2010-12-23 patchlevel 330) [i386-mswin32]
  187: ruby 1.8.7 (2011-06-30 patchlevel 352) [i386-mingw32]
  191: ruby 1.9.1p430 (2010-08-16 revision 28998) [i386-mingw32]
  193: ruby 1.9.3p0 (2011-10-30) [i386-mingw32]
$ pik use 1.9.1
$ pik list
  187: ruby 1.8.7 (2010-12-23 patchlevel 330) [i386-mswin32]
  187: ruby 1.8.7 (2011-06-30 patchlevel 352) [i386-mingw32]
* 191: ruby 1.9.1p430 (2010-08-16 revision 28998) [i386-mingw32]
  193: ruby 1.9.3p0 (2011-10-30) [i386-mingw32]
$ which ruby
C:\rubies\Ruby-191-p430\bin\ruby.exe
$ ruby -v
ruby 1.9.1p430 (2010-08-16 revision 28998) [i386-mingw32]

1.9.1確認。%USERPROFILE%\.pik\config.ymlも更新されてた。

--- 
"187: ruby 1.8.7 (2010-12-23 patchlevel 330) [i386-mswin32]": 
  :path: !ruby/object:Pathname 
    path: C:/rubies/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
"191: ruby 1.9.1p430 (2010-08-16 revision 28998) [i386-mingw32]": 
  :path: !ruby/object:Pathname 
    path: C:/rubies/Ruby-191-p430/bin
"193: ruby 1.9.3p0 (2011-10-30) [i386-mingw32]": 
  :path: !ruby/object:Pathname 
    path: C:/rubies/Ruby-193-p0/bin
--- 
:install_dir: !ruby/object:Pathname 
  path: c:\rubies\

最後に実行してみ…なんじゃこりゃあーー!

$ bundle exec ruby test.rb
Error loading gem paths on load path in gem_prelude
can't modify frozen string
<internal:gem_prelude>:69:in `force_encoding'
<internal:gem_prelude>:69:in `set_home'
<internal:gem_prelude>:38:in `dir'
<internal:gem_prelude>:76:in `set_paths'
<internal:gem_prelude>:47:in `path'
<internal:gem_prelude>:286:in `push_all_highest_version_gems_on_load_path'
<internal:gem_prelude>:355:in `<compiled>'
<internal:gem_prelude>:345:in `method_missing': undefined method `user_home' for Gem:Module (NoMethodError)
        from C:/rubies/Ruby-191-p430/lib/ruby/gems/1.9.1/gems/bundler-1.0.21/lib/bundler/rubygems_integration.rb:57:in `user_home'
        from C:/rubies/Ruby-191-p430/lib/ruby/gems/1.9.1/gems/bundler-1.0.21/lib/bundler/settings.rb:107:in `global_config_file'
        from C:/rubies/Ruby-191-p430/lib/ruby/gems/1.9.1/gems/bundler-1.0.21/lib/bundler/settings.rb:6:in `initialize'
        from C:/rubies/Ruby-191-p430/lib/ruby/gems/1.9.1/gems/bundler-1.0.21/lib/bundler.rb:185:in `new'
        from C:/rubies/Ruby-191-p430/lib/ruby/gems/1.9.1/gems/bundler-1.0.21/lib/bundler.rb:185:in `settings'
        from C:/rubies/Ruby-191-p430/lib/ruby/gems/1.9.1/gems/bundler-1.0.21/lib/bundler.rb:261:in `configure_gem_home_and_path'
        from C:/rubies/Ruby-191-p430/lib/ruby/gems/1.9.1/gems/bundler-1.0.21/lib/bundler.rb:82:in `configure'
        from C:/rubies/Ruby-191-p430/lib/ruby/gems/1.9.1/gems/bundler-1.0.21/lib/bundler.rb:136:in `definition'
        from C:/rubies/Ruby-191-p430/lib/ruby/gems/1.9.1/gems/bundler-1.0.21/lib/bundler.rb:126:in `load'
        from C:/rubies/Ruby-191-p430/lib/ruby/gems/1.9.1/gems/bundler-1.0.21/lib/bundler.rb:110:in `setup'
        from C:/rubies/Ruby-191-p430/lib/ruby/gems/1.9.1/gems/bundler-1.0.21/lib/bundler/setup.rb:7:in `<top (required)>'
        from C:\rubies\Ruby-191-p430\bin\ruby.exe:0:in `require'

Ruby1.9.1の現象らしい…。1.9.2に切り替えて…。

$ bundle exec ruby myapp.rb
[2011-11-29 13:45:14] INFO  WEBrick 1.3.1
[2011-11-29 13:45:14] INFO  ruby 1.9.2 (2011-07-09) [i386-mingw32]
== Sinatra/1.3.1 has taken the stage on 4567 for development with backup from WEBrick
[2011-11-29 13:45:14] INFO  WEBrick::HTTPServer#start: pid=4568 port=4567

ふぅ…いろんなことが起こりすぎた…。最後のエラーは置いといて、デフォルトでスペース入っているパスにインストールされると危ないな。

結論

  • Rubyのインストールパスにスペースを含めない
  • pikでRubyをインストールする前にpik config install_dir=XXXでパス指定する

大事なことだったので二回書いた。