🤖🚫 AI-free content. This post is 100% written by a human, as is everything on my blog. Enjoy!

Как завести Rails 3 вместе с Passenger

August 3, 2010 in Ruby on Rails

Поставить Rails 3 на Passenger – дело нетривиальное, ибо:

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 # домашний каталог пользователя

Buy me a coffee Понравился пост? Купи мне кофе