"неинициализированная константа CarrierWave" при развертывании приложения Rails на сервере с Capistrano

У меня есть приложение Rails, которое прекрасно работает локально на Mac OS X с использованием Ruby 1.9.3 и Rails 3.2.13. Он был развернут на моем виртуальном сервере Ubuntu (nginx / unicorn) с использованием Capistrano и работает нормально.

Проблема возникла, когда я установил гем CarrierWave с помощью RMagick. Они были добавлены в 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 запускает связку: устанавливает и перезапускает сервер при развертывании, но я попытался сделать оба вручную без каких-либо изменений.

Я видел несколько похожих проблем, о которых сообщалось в Интернете, но ни одна из них не имела решения, которое, похоже, связано с этим - некоторые говорят, что оно не имеет никакого отношения к CarrierWave, но не говорят, какое оно имеет отношение к делу.

Может кто-нибудь дать мне какие-нибудь указатели, пожалуйста, пока я cap deploy:rollback снова?

Благодарю.

Последнее обновление:

У меня есть приложение и работает на сервере. В то время как require 'carrierwave' не работал в файле application.rb, входя на сервер как пользователь развертывания, переходя в каталог приложения, открывая консоль rails, используя RAILS_ENV=production bundle exec rails c а затем печатать require 'carrierwave' кажется, заставил это работать.

Я пока не отмечаю это как ответ, поскольку подозреваю, что все может снова остановиться при следующем развертывании, но, возможно, это сузит проблему.

1 ответ

Похоже, это может быть связано с требуемым порядком драгоценных камней. См. Этот вопрос о стековом потоке в контексте Некоторые люди, кажется, взбираются на это с явным требованием в application.rb (как это), но мы надеемся изменить порядок в Gemfile на:

gem 'rmagick'
gem 'carrierwave'

должен это исправить.

Также это может помочь убедиться, что RMagick правильно установлен на вашем сервере.

Другие вопросы по тегам