Monday, 26 March 2012

Heroku でデプロイ時にgemのlibファイル読み込みエラー

Heroku でアプリケーションのデプロイ中に2回ほどはまってしまったのですが、そのうちの一つはgemのlibファイル読み込みエラーが発生するというものです。

最初のエラーは gem thin の読み込みエラーで、Herokuからのエラーメッセージは


2012-03-23T01:13:29+00:00 heroku[web.1]: Starting process with commandbundle exec thin start -R config.ru -e production -p 348962012-03-23T01:13:30+00:00 app[web.1]: /app/vendor/bundle/ruby/1.9.1/gems/thin-1.3.1/lib/thin.rb:41:in `require': cannot load such file -- /app/vendor/bundle/ruby/1.9.1/gems/thin-1.3.1/lib/thin_parser (LoadError)
I looked into /app/vendor/bundle/ruby/1.9.1/gems/thin-1.3.1/lib/ folder and indeed, could not find thin_parser.rb file. I have spent some time, but cannot solve this issue.
gem ファイルは正しくbundleされているはずだし、何がおかしいのか分からずしばらく時間を費やしました。ある時この記事に引っかかり問題が解決しました。--> http://bit.ly/GKNjjo
解決策はローカルで bundle install を実行する時に Gemfile に
group :development, :test do
gem 'sqlite3'
gem 'heroku'
gem 'taps'
end
group :production, :staging do gem 'pg' gem 'thin'end

などと記述して本番と開発環境で使用するgemを分け、さらに私はこれのステップで失敗したのですが、 bundle install をする際にオプションで意図的に本番環境の gem を /vendor/bundle/ に生成させないように
$ bundle install --without production
を指定する必要があります。すでに一度このオプションを指定しないで bundle install を実行してしまった場合はフォルダーを消せば問題ありません。
上の作業を実行すると Heroku の環境にネイティブな gem とライブラリがデプロイ時にインストールされ library ファイル読み込みのエラーメッセージが消えました。
今回はHerokuのインストラクションに従いスタンダードな形でアプリケーションをデプロイしました。問題は解決されたのですが、実際 Heroku でどのように thin が動いているのか、スタンダードRailsアプリケーションデプロイ時に指定する --stack cedar がどのように動いているのか、などなど残念ながら分からずにサービスを利用している部分が山積みです。時間を割いて理解したいです。

No comments:

Post a Comment