参考: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の記述法)。次項で別途説明しています。