こんにちは
この記事は、Ruby Advent Calendar jp: 2009 参加記事です。
- 前日の記事:willnetさん / controllerを少しだけスリムにするtips
- 翌日の記事:m-kawatoさん / ハッシュを構造体のように使う
今回、Ruby1.8.7、1.9.1、そして1.9.2preview1を、1コマンドで簡単に切り替えるtips(設定手順)を書きます。
改めて読み返したらRubyのコードが一行もありませんでしたが、よろしくお願いします。
前提条件など
まず、実行環境としてUbuntu 9.10をナニかに入れましょう。PCでもVMWareでもなんでもいいと思います。ちなみに、gihyo.jpの記事が大いに参考になります。マニアックなデュアルブート構成の手順が詳細に載っています。
切り替えのために、「update-alternatives」という便利コマンドを使用します。このupdate-alternativesが入っていればFedoraでもなんでも良いと思いますが、今回はUbuntu 9.10(それ以前のバージョンでも大体同じと思う、リポジトリとか違うかも)での手順を説明します。
やり方
まず、3つのRubyを入れます。1.8、1.9.1は aptitude で、1.9.2はコンパイルしましょう(1.9.1は、2009年12月13日現在、脆弱性のあるバージョン(ruby 1.9.1p243)が入ってしまうので注意してください。そのうちにリポジトリもUpdateされるかと思います……)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | ### install rubies # install ruby 1.8.7 sudo aptitude install ruby1.8 ruby1.8-dev irb1.8 rubygems1.8 rake # おまじない sudo mv /usr/bin/rake /usr/bin/rake1.8 # install ruby1.9.1 sudo aptitude install ruby1.9.1-full rubygems1.9.1 # install ruby1.9.2dev sudo mkdir /usr/local/ruby1.9.2 wget ftp://ftp.ruby-lang.org/pub/ruby/1.9/ruby-1.9.2-preview1.tar.bz2 bunzip2 -c ruby-1.9.2-preview1.tar.bz2 | tar xf - cd ruby-1.9.2-preview1 ./configure --prefix=/usr/local/ruby1.9.2 --program-suffix=1.9.2 make sudo make install |
1.9.2をコンパイルするときのオプションについて。 --prefix は呪術的な何かで(w --program-suffix は、パッケージから入れたRuby関連ファイルには「1.8」「1.9.1」とかサフィックスが付くため、それに合わせて、です。 無事インストールされたら、 /usr/local/ruby1.9.2/bin が賑やかになってます。
1 2 | udzura@ubuntu-vaio:~/src/ruby-1.9.2-preview1$ ls /usr/local/ruby1.9.2/bin erb1.9.2 gem1.9.2 irb1.9.2 rake1.9.2 rdoc1.9.2 ri1.9.2 ruby1.9.2 testrb1.9.2 |
ここが大事なことなんですが、こういう呪術的な場所にインストールされたからといって、環境変数PATHをいじる必要は(基本的には)ありません! これから、 update-alternatives の設定に入ります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | ### update-alternativesの設定 # なぜかgemだけupdate-alternativesの管理に入って # インストールされているので、一旦削除 sudo update-alternatives --remove-all gem # 設定 sudo update-alternatives --install /usr/bin/ruby ruby /usr/bin/ruby1.8 120\ --slave /usr/bin/irb ruby-irb /usr/bin/irb1.8\ --slave /usr/bin/gem ruby-gems /usr/bin/gem1.8\ --slave /usr/bin/rake ruby-rake /usr/bin/rake1.8 sudo update-alternatives --install /usr/bin/ruby ruby /usr/bin/ruby1.9.1 150\ --slave /usr/bin/irb ruby-irb /usr/bin/irb1.9.1\ --slave /usr/bin/gem ruby-gems /usr/bin/gem1.9.1\ --slave /usr/bin/rake ruby-rake /usr/bin/rake1.9.1 # 実行ファイルのPATHは読み替えてね sudo update-alternatives --install /usr/bin/ruby ruby /usr/local/ruby1.9.2/bin/ruby1.9.2 100\ --slave /usr/bin/irb ruby-irb /usr/local/ruby1.9.2/bin/irb1.9.2\ --slave /usr/bin/gem ruby-gems /usr/local/ruby1.9.2/bin/gem1.9.2\ --slave /usr/bin/rake ruby-rake /usr/local/ruby1.9.2/bin/rake1.9.2 |
これで完了です。update-alternatives でフルパスを指定するので、$PATHは無傷で大丈夫、というわけです。
今回、 ruby irb gem rake だけ設定してますが、必要に応じて --slave で rdoc なんかを追加してください。
切り替え方
sudo update-alternatives --config ruby で簡単に、対話的に切り替えられます。
1 2 3 4 5 6 7 8 9 10 11 | udzura@ubuntu-vaio:~$ sudo update-alternatives --config ruby There are 3 choices for the alternative ruby (providing /usr/bin/ruby). Selection Path Priority Status ------------------------------------------------------------ * 0 /usr/bin/ruby1.9.1 150 auto mode 1 /usr/bin/ruby1.8 120 manual mode 2 /usr/bin/ruby1.9.1 150 manual mode 3 /usr/local/ruby1.9.2/bin/ruby1.9.2 100 manual mode Press enter to keep the current choice[*], or type selection number: |
試してみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | udzura@ubuntu-vaio:~$ ruby -v ruby 1.9.1p243 (2009-07-16 revision 24175) [i486-linux] udzura@ubuntu-vaio:~$ irb irb(main):001:0> RUBY_VERSION => "1.9.1" ... Press enter to keep the current choice[*], or type selection number: 1 update-alternatives: using /usr/bin/ruby1.8 to provide /usr/bin/ruby (ruby) in manual mode. udzura@ubuntu-vaio:~$ udzura@ubuntu-vaio:~$ ruby -v ruby 1.8.7 (2009-06-12 patchlevel 174) [i486-linux] udzura@ubuntu-vaio:~$ irb irb(main):001:0> RUBY_VERSION => "1.8.7" ... Press enter to keep the current choice[*], or type selection number: 3 update-alternatives: using /usr/local/ruby1.9.2/bin/ruby1.9.2 to provide /usr/bin/ruby (ruby) in manual mode. udzura@ubuntu-vaio:~$ udzura@ubuntu-vaio:~$ ruby -v ruby 1.9.2dev (2009-07-18 trunk 24186) [i686-linux] udzura@ubuntu-vaio:~$ irb irb(main):001:0> RUBY_VERSION => "1.9.2" |
幸福が実現しました!
※ ちなみに、gemsも別々で管理されるようです
なお、update-alternativesの詳細な書き方
1 2 3 4 5 6 | update-alternatives --install link name path priority [--slave link name path]... link: 共通の実行ファイル。この参照先が切り替わる、ということ name: 管理上の名前 path: 切り替わり先の実行ファイル本体 priority: 優先度(高いほど優先) --slave 以下はいくつでも マスターと一緒に切り替わるプログラムを指定する |
こんな感じです。続きは man update-alternatives で!
misc
これはUbuntu特有の問題ですが、まず、パッケージ経由のRubyGemsだと、Gems経由でインストールした実行ファイル( mongrel_rails とか rails とかそういう感じのモノ)が妙な場所に出来てしまうらしいです。参考サイト。 なので、今回は簡便のためにパッケージから入れてますが、本来はRubyGemsのソースを落とし、展開して
1 | sudo /usr/bin/ruby1.8 setup.rb |
とかをバージョンごとに実施した方が良いみたいですね(12/13 20:49 sudo追加しました)。でも、例えばRuby on Railsだったらパッケージのrailsとかでインストールして、実行ファイルの頭が
1 | #!/usr/bin/ruby1.8 |
とかになってるのを、
1 | #!/usr/bin/env ruby |
とかに変えてやればごまかせるんじゃないか、と思います。。まあ、検証環境ですよということで。。
あと、呪術的な場所にRuby1.9.2preview1をインストールしたため、1.9.2にしてる最中、コンパイルが必要なgem installは
1 | sudo gem install nokogiri -- --with-opt-dir=/usr/local/ruby1.9.2 |
とかしてあげないとまずい気がします。少なくとも、これをしてあげたら、無事1.9.2環境でNokogiriが動きました(Ubuntuでは別途 sudo aptitude install libxml2-dev libxslt1-dev とかしましょう)。
* * *
以上です。Ruby1.8.7/1.9.1/1.9.2 を試したり比べたり、の一助になれば幸いです。
Trackback: プログラミングは素晴らしい