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
Changeset 45292 for trunk/dports/lang/ruby186 – MacPorts
compatibility reasons (not heavily tested)
古い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