Как завести Rails 3 вместе с Passenger
August 3, 2010 in Ruby on RailsПоставить Rails 3 на Passenger – дело нетривиальное, ибо:
- Bundler из Passenger не находит гемов, установленных в домашний каталог пользователя, то есть установленных посредством
bundle install. - RailsEnv, установленный в конфиге Passenger, не используется, то есть всегда используется
production
UPD: как на самом деле обстоят дела
На самом деле проблема в том, что я не вызывал bundle lock. Эта команда (что никак не очевидно) не только «запирает» набор зависимостей. Она также создает файл Gemfile.lock, в котором находится информация о том, откуда эти зависимости брать. И ошибка
git://repo/path.git (at master) is not checked out. Please run `bundle install` (Bundler::PathError)
на самом деле значит, что нужно было вызвать bundle lock.
UPD 2: в Bundler 1.0 (gem install bundler --pre) команда bundle lock не используется, а точнее отрабатывает автоматически при bundle install. А проблема моя была в том, что у меня стояло PassengerUserSwitching off (пользователь-то один), ввиду этого Passenger видимо не отдавал Bundler-у путь к домашнему каталогу и Bundler пользовался только системными гемами. Мораль: какие-то третьи рельсы сильно связанные.
/UPD 2
Кроме того, переназначение ENV['RAILS_ENV']=ENV['RACK_ENV'] совершенно необязательно, достаточно всего лишь указать правильный RackEnv в настройках Passenger.
А config.ru можно оставить в покое.
/UPD: все, что дальше, можно не читать
Помучавшись немного, я нашел источник этих проблем: приложения Rails 3 являются и рассматриваются как полноценные приложения Rack.
Из этого следует (я так понимаю), что переменные окружения в Rails не попадают, их нужно объявлять отдельно в config.ru, то есть в конфиге Rack. Не попадает туда BUNDLER_HOME. Кроме того, поскольку Passenger обрабатывает Rails-приложения как Rack-приложения, вместо директивы RailsEnv нужно использовать RackEnv, а потом в том же config.ru присваивать ее обратно.
Резюмируя, нужно в конфиг Passenger добавить RackEnv development, а в начало config.ru вписать следующие строки:
require 'etc' ENV['RAILS_ENV'] = ENV['RACK_ENV'] if !ENV['RAILS_ENV'] && ENV['RACK_ENV'] ENV['BUNDLER_HOME'] = Etc.getpwuid.dir # домашний каталог пользователя
Понравился пост? Купи мне кофе

