こんにちは

この記事は、Ruby Advent Calendar jp: 2009 参加記事です。

今回、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 だけ設定してますが、必要に応じて --slaverdoc なんかを追加してください。

切り替え方

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 を試したり比べたり、の一助になれば幸いです。