以下は全部 Media Temple Grid-Server の Ruby on Rails Container を使ってる場合に限っての話なので、関心のある人はごく少ないとは思いますが、僕はこれのおかげで先月かなりの時間を無駄にしたので、ひとりでも同じことにはまってる人がいたら役に立つだろうと思って書いときます。
Ruby-GetText-Package を使おうとしたわけです。これはおもに UI のローカライゼーションに使われる gettext の Ruby 版です。いま使っている Ruby on Rails 1.2.2 に対応しているのは Ruby-GetText-Package 1.9.0 で、1.8.0 以前のはうまく動きません。
ローカル PC 上の development 環境に Ruby-GetText-Package 1.9.0 の gem をインストールして、正常に日本語化できるのを確認しました。それでいざ、Grid-Server の production 環境に展開してみたらさっぱり動かんわけです。mtr start して mongrel を起動する段階でこけてしまう。
mongrel.log を見るとこんなエラーが出てました(一部伏字と改行挿入)。
** Starting Mongrel listening at 0.0.0.0:****
** Starting Rails with production environment...
/home/****/data/rubygems/gems/gems/activesupport-1.4.1/lib/active_support/
dependencies.rb:263:in `load_missing_constant':
uninitialized constant Locale::System (NameError)
from /home/****/data/rubygems/gems/gems/activesupport-1.4.1/lib/
active_support/dependencies.rb:452:in `const_missing’
from /home/****/data/rubygems/gems/gems/gettext-1.9.0/lib/gettext/
locale_posix.rb:17
from /home/****/data/rubygems/local/lib/site_ruby/1.8/rubygems/
custom_require.rb:27:in `require’
from /home/****/data/rubygems/gems/gems/activesupport-1.4.1/lib/
active_support/dependencies.rb:495:in `require’
from /home/****/data/rubygems/gems/gems/activesupport-1.4.1/lib/
active_support/dependencies.rb:342:in `new_constants_in’
from /home/****/data/rubygems/gems/gems/activesupport-1.4.1/lib/
active_support/dependencies.rb:495:in `require’
from /home/****/data/rubygems/gems/gems/gettext-1.9.0/lib/gettext/
locale.rb:40
from /home/****/data/rubygems/local/lib/site_ruby/1.8/rubygems/
custom_require.rb:27:in `require’
… 25 levels…
from /home/****/data/rubygems/gems/gems/mongrel-1.0.1-i386-linux/bin/
mongrel_rails:83:in `run’
from /home/****/data/rubygems/gems/gems/mongrel-1.0.1-i386-linux/lib/
mongrel/command.rb:211:in `run’
from /home/****/data/rubygems/gems/gems/mongrel-1.0.1-i386-linux/bin/
mongrel_rails:243
from /home/****/data/rubygems/gems/bin/mongrel_rails:16
僕はいろいろ試行錯誤したあげく理由がわからず、結局そのときは Rails 1.1.6 と gettext 1.8.0 を使うという回避策(この組み合わせなら動いた) に逃げたわけですが、後になってわかってみたら単純なことでした。
Grid-Server の Ruby on Rails Container 環境では C の拡張を含むタイプの gem が正常に動かない場合があります。Ruby-GetText-Package や RMagick がそれに該当するようです。Media Temple ではそれらの gem を使えるようにするために、コンパイル済みの特注 gem を用意して自社のリポジトリで公開しています。
もし必要な gem がまだなければサポートにリクエストをあげればコンパイルしてリポジトリに追加してくれます。Ruby-GetText-Package の 1.9.0 の gem はまだなかったので、サポートに連絡して追加をお願いしたところすぐに追加してくれ、これで正常に動作するようになりました。
うまくいかないときは思い出してみるといいかもしれません。
