Как завести 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 # домашний каталог пользователя
Понравился пост? Купи мне кофе