参考:Ruby2.0.0への移行について(準備・実行環境編)

もともとのきっかけは、このBOTが動作しているMacintosh(OSX Lion)の調子が悪く、HDD(SDD)交換を余儀なくされたこと。
さらに、運がよいのか悪いのか丁度その時Marvericksが発表。誘惑にかられて思わずアップグレードしてしまいそうになりましたが、MarvericksにプリインストールされているRubyは2.0.0とのこと。
Rubyは1.9系以降、文字列操作を含め仕様が大幅に(?)変更されたとのことで、いきなり入れてもすんなりとは動かないだろうと感じ、現状のOSまま2.0.0を別途インストールし、そこでテストしようと考えました。
バージョン管理はRVMを使用しています。RVMで2.0.0(およびGEMライブラリ)をインストール(参考)しておけば、ターミナルで…

rvm system # OS(Lion)にプリインストールしているRubyを使用
rvm 2.0.0 # 2.0.0を使用

…と切り替えることにより、テストが可能となります。

このBOTを開発した時点では1.9は既に発表され、ヴァージョン別記述例が掲載された入門書も発刊されていたこともあり、事前準備のおかげかテストは意外とすんなり完了しましたが、問題はlaunchdの記述方法。RVM絡みの参考例はWeb上にそれほど存在しませんので、少々悩みました…が、一応解決し、無事本番稼働しています。

移行前は、このような記述でしたが…

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>Label</key>
		<string>hogehoge</string>
	<key>ProgramArguments</key>
	<array>
		<string>ruby</string>
		<string>hogehoge.rb</string>
	</array>
	<key>WorkingDirectory</key>
		<string>/Users/ユーザー名/任意のディレクトリ</string>
	<key>StartInterval</key>
		<integer>任意の値</integer>
	<key>RunAtLoad</key>
	 	<true/>
	<key>StandardErrorPath</key>
		<string>/Users/ユーザー名/任意のディレクトリ/ログファイル名.log</string>
	<key>StandardOutPath</key>
		<string>/Users/ユーザー名/任意のディレクトリ/ログファイル名.log</string>
</dict>
</plist>

以下の内容に変更。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>Label</key>
		<string>hogehoge</string>
	<key>ProgramArguments</key>
	<array>
		<string>./シェルスクリプト名.sh</string>
		<string>hogehoge.rb</string>
	</array>
	<key>WorkingDirectory</key>
		<string>/Users/ユーザー名/任意のディレクトリ</string>
	<key>StartInterval</key>
		<integer>任意の値</integer>
	<key>RunAtLoad</key>
	 	<true/>
	<key>StandardErrorPath</key>
		<string>/Users/ユーザー名/任意のディレクトリ/ログファイル名.log</string>
	<key>StandardOutPath</key>
		<string>/Users/ユーザー名/任意のディレクトリ/ログファイル名.log</string>
</dict>
</plist>

実質「./シェルスクリプト名.sh」の箇所しか変更していません。
そのシェルスクリプトは下記のように記述。

#!/bin/bash --login

rvm use 2.0.0 # 1.8.7に戻す場合はコメントに
#rvm use system # 1.8.7にて実行する場合はこちら(実際は不要)

ruby "$@"

当初はlaunchdのみで完結させようと思っていましたが、RVM絡みのパスを一切指定することもなく、記述も簡潔なため、この方法が一番楽だと思います。

Rubyについては、何かあった場合いつでも1.8.7系に戻せるよう、バージョンによる処理手順が異なる場合…

if RUBY_VERSION <= '1.8.7' 
  1.8.7以前の処理
else
  1.9系以降の処理
end

…といった記述を心がけています。
但し、文法の違いを表現する場合、syntax errorで落ちるケースがありました(具体的にはActiveRecoedのscopeの記述法)。次項で別途説明しています。