1

Ruby 1.9.3 と Rails 3.2.13 を使用して、Mac OS X でローカルに完全に動作する Rails アプリがあります。これは、Capistrano を使用して Ubuntu 仮想サーバー (nginx / unicorn) にデプロイされ、正常に動作しています。

RMagick を使用して CarrierWave gem をインストールしたときに問題が発生しました。これらは gemfile に追加され、ローカルでは問題なく動作しましたが、サーバーにデプロイすると毎回 500 エラーが発生します。

サーバー上の unicorn.log からの簡単な抜粋:

E, [2013-06-28T12:04:05.937845 #2758] ERROR -- : reaped #<Process::Status: pid 23786 exit 1> worker=0
I, [2013-06-28T12:04:05.939517 #2758]  INFO -- : worker=0 spawning...
I, [2013-06-28T12:04:05.968225 #23793]  INFO -- : worker=0 spawned pid=23793
I, [2013-06-28T12:04:05.969959 #23793]  INFO -- : Refreshing Gem list
E, [2013-06-28T12:04:59.669504 #23793] ERROR -- : uninitialized constant CarrierWave (NameError)
/home/deployer/apps/panto/releases/20130628115346/app/uploaders/image_uploader.rb:3:in `<top (required)>'
/home/deployer/apps/panto/releases/20130628115346/app/models/picture.rb:4:in `<class:Picture>'
/home/deployer/apps/panto/releases/20130628115346/app/models/picture.rb:1:in `<top (required)>'

「初期化されていない定数」エラーで参照されているファイルは、CarrierWave 独自のジェネレーターによって作成された私の CarrierWave アップローダ クラスであり、次のように始まります。

# encoding: utf-8

class ImageUploader < CarrierWave::Uploader::Base

  # Include RMagick or MiniMagick support:
  include CarrierWave::RMagick
  # include CarrierWave::MiniMagick

  # Include the Sprockets helpers for Rails 3.1+ asset pipeline compatibility:
  include Sprockets::Helpers::RailsHelper
  include Sprockets::Helpers::IsolatedHelper

したがって、エラーはメインの CarrierWave クラスの継承に関連しています。

Gemfile からの抜粋:

gem 'jquery-rails'
gem 'simple_form'
gem 'country_select'
gem 'carrierwave'
gem 'rmagick'

そして Gemfile.lock から:

carrierwave (0.8.0)
  activemodel (>= 3.2.0)
  activesupport (>= 3.2.0)
...
rmagick (2.13.2)

これらのファイルは、私の git リポジトリとサーバー上で同一です。これは、ローカルで実行されているアプリが CarrierWave を見つけるのに十分であるように見えますが、サーバー バージョンでは不十分です。

Capistrano は bundle:install を実行し、展開時にサーバーを再起動しますが、変更を加えずに両方を手動で実行しようとしました。

オンラインで同様の問題がいくつか報告されているのを見たことがありますが、これに関連すると思われる解決策を示したものはありません。

私が再びいる間、誰か私に何か指針を教えてもらえますcap deploy:rollbackか?

ありがとう。

最新の更新:

サーバー上でアプリを起動して実行しています。application.rb ファイルでは機能しませrequire 'carrierwave'んでしたが、デプロイ ユーザーとしてサーバーにログインし、app ディレクトリに移動し、Rails コンソールを開いてRAILS_ENV=production bundle exec rails c入力するrequire 'carrierwave'と、機能したようです。

次の展開ですべてが再び停止する可能性があると思われるため、まだ回答済みとしてマークしていませんが、問題を絞り込む可能性があります。

4

1 に答える 1

0

これは、必要な宝石の順序に関連しているようです。コンテキストについては、このスタックオーバーフローの質問を参照してください。一部の人々は、 application.rb で明示的な require を使用してハッキングしているようですが (このように)、Gemfile の順序を次のように変更することを願っています。

gem 'rmagick'
gem 'carrierwave'

それを修正する必要があります。

また、これは、サーバーに RMagick が正しくインストールされていることを確認するのにも役立ちます。

于 2013-06-28T12:53:30.593 に答える