[Ruby][備忘録]pikでインストールしたRubyでbundle exec rubyしたらエラーになった 解決編
前回までのあらすじ
[http://d.hatena.ne.jp/kk_Ataka/20111128/1322482230:title]で出た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
なるほど。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'
- http://saikyoline.jp/weblog/2011/09/10/013622.html:title
- http://d.hatena.ne.jp/sasaplus1/20110522/1306074417:title
- http://www.ruby-forum.com/topic/1832630:title
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でパス指定する
大事なことだったので二回書いた。