MacPortsでRuby 1.8.6と1.8.7を切り替えられるようにした。

MacPortsにruby186が追加されていました。今年の1月に追加されたようです。

New port - lang/ruby186, Ruby at version 1.8.6 for those who need it for
compatibility reasons (not heavily tested)

Changeset 45292 for trunk/dports/lang/ruby186 – MacPorts

古いRailsアプリケーションを動かすのに1.8.6を使いたいことがあるんですが、これでローカルリポジトリを作らずに済むようになりました。

以下作業手順。

ローカルリポジトリを消す。

この記事で作成したローカルリポジトリを消します。

うまくいかなかった時に戻せるようにgitで現状を保存しています。最近はバックアップディレクトリを作る代わりにgitを使ってみてるんですが、本題と全然関係ないので適当に無視してください、、。

$ cd /Users/Shared/dports
$ git init
$ git add .
$ git commit -m 'ruby 1.8.6'

Ruby 1.8.6以外の用途でローカルリポジトリを使ってなかったのでdports/langとdports/rubyを丸ごと消します。

$ rm -rf lang
$ rm -rf ruby
$ portindex .
$ git commit -am 'remove ruby 1.8.6'

rubyを1.8.7にアップグレード。

ruby @1.8.6を@1.8.7にアップグレードします。

$ sudo port upgrade ruby
$ port installed ruby 
The following ports are currently installed:
  ruby @1.8.6-p114_0+darwin_9+thread_hooks
  ruby @1.8.7-p72_2+thread_hooks (active)

ruby @1.8.6をアンインストールします。

$ sudo port uninstall ruby @1.8.6-p114_0+darwin_9+thread_hooks
--->  Uninstalling ruby @1.8.6-p114_0+darwin_9+thread_hooks

ruby @1.8.6でうまく動かなかったrubygemsもアップグレード。

$ sudo port upgrade rb-rubygems
$ port installed rb-rubygems
The following ports are currently installed:
  rb-rubygems @1.2.0_0
  rb-rubygems @1.3.1_0 (active)

ruby186をインストール。

rubyをdeactivateしてruby186をインストールします。

$ sudo port deactivate ruby
$ sudo port install ruby186

最新のgemがruby186で動くかどうか確認。大丈夫そうなので、ローカルリポジトリから入れたrubygems @1.2.0_0はアンインストールします。

$ sudo port uninstall rb-rubygems @1.2.0_0

これでrubyとruby186が両方入った状態になりました。

$ port installed ruby
The following ports are currently installed:
  ruby @1.8.7-p72_2+thread_hooks
$ port installed ruby186
The following ports are currently installed:
  ruby186 @1.8.6-p287_0+darwin_9+thread_hooks (active)

シェルスクリプトで簡単に切り替えられるようにする。

rubyとruby186を切り替えるためのシェルスクリプト switchrb.sh を適当な場所に置きます。

#! /bin/sh

ACTIVE=`ruby --version | grep '1\.8\.6'`
if [ -n "$ACTIVE" ]; then
  DEACTIVATE="ruby186"
  ACTIVATE="ruby"
else
  DEACTIVATE="ruby"
  ACTIVATE="ruby186"
fi

if [ "$1" = "186" -a $DEACTIVATE = "ruby186" ]; then
  echo "ERROR: ruby186 is already active."
  exit
elif [ "$1" = "187" -a $DEACTIVATE = "ruby" ]; then
  echo "ERROR: ruby187 is already active."
  exit
elif [ "$1" != "186" -a "$1" != "187" -a -n "$1" ]; then
   echo "Usage: $0 [186|187]"
   echo "Current: $DEACTIVATE"
   exit
fi

sudo port deactivate $DEACTIVATE
sudo port activate $ACTIVATE

使い方。

# 引数で186か187を指定します。

$ switchrb.sh 187
--->  Deactivating ruby186
--->  Activating ruby
$ switchrb.sh 186
--->  Deactivating ruby
--->  Activating ruby186
$ ./switchrb.sh 186
ERROR: ruby186 is already active.

# 引数を指定しない場合はruby --versionで判断します。

$ switchrb.sh
--->  Deactivating ruby186
--->  Activating ruby
$ switchrb.sh
--->  Deactivating ruby
--->  Activating ruby186

# その他適当な引数でUsageを表示。

$ switchrb.sh --help
Usage: ./switchrb.sh [186|187]
Current: ruby186

ベースのシェルスクリプトもりやまくんにもらいました。ありがとー!