Как стать автором
Обновить

Комментарии 20

>>наткнутся на несколько граблей, и копнуть поглубже. И очень ко времени попалась на глаза вот эта статья, перевод которой я на ваше обозрение и предоставляю.

Вы взорвали мой мозг.
1. RVM хорош на девелоперской машине, но его поддержка в capistrano — это сплошная боль.
2. Гемсеты нужны для старых приложений на rails 2.x и без bundler (RedMine, например).
3. Чтобы использовать rbenv в capistrano нужно прописать всего лишь одну строчку:

set :default_environment, { "PATH" => "/usr/local/rbenv/shims:/usr/local/rbenv/bin:$PATH", "RBENV_VERSION" => "1.9.3-p0" }

И если на сервере rbenv ещё не установлен, то в capistrano ничего не сломается (в отличии от rvm, который заменяет default_shell).
у нас production практически весь переезжает на system wide RVM. никаких проблем не отмечено.
Я сейчас тоже использую system-wide RVM на всех серверах. Но попробовав на одном rbenv, могу сказать, что настройка и развертывание весьма упрощаются (как по объему работы на серверах, так и по настройке рецептов capistrano). Так что буду мигрировать потихоньку на rbenv.
на мой взгляд rvm c capistrano работает просто прекрасно, вот какая настройка в моем проект:

require 'rvm/capistrano'

set :ruby_version, '1.9.2'
set :rvm_ruby_string, "#{ruby_version}@#{application}"
set :rvm_path, "/usr/local/rvm"
set :rvm_bin_path, "/usr/local/rvm/bin"
set :rvm_type, :system

и это еще много, так как я храню все в /usr/local, если бы я использовал дефолтное положение в $HOME/.rvm то обойтись можно было первыми двумя строчками
А теперь попробуйте сделать cap deloy:check или cap deploy:setup на сервере без rvm.
Ясное дело что rvm с начала нужно поставить. Думаю вы не станете деплоить приложение на сервер на котором, скажем, не установлен ruby. Ну а там где установить возможности нет, например взять всеми любимый Heroku, то потдержка RVM в нем имеется из коробки, чего нельзя сказать о rbenv.
Что делает невозможным автоматизацию установки rvm через capistrano. Выполнить наш абстрактный cap rvm:install никак уже не получится. Так же как и любую задачу, где нужно сделать что-то ДО установки rvm.
А вы ось на сервер тоже через cap ставите, да?
Купили суровые сибирские мужики умную японскую бензопилу. Попробовали суровые сибирские мужики японскую умную пилу на березке стройной.
— Вжик, — сказала умная японская пила.
— Оооо, — сказали суровые сибирские мужики.
Попробовали суровые сибирские мужики умную японскую пилу на дубе вековом.
— Вжжик, — сказала умная японская пила.
— Ооооо, — сказали суровые сибирские мужики.
Попробовали суровые сибирские мужики умную японскую пилу на рельсе железной.
— Хр… хрррр… — сказала умная японская пила.
— Агааа! — воскликнули суровые сибирские мужики.

Это я к тому, что зачем запускать деплой на сервере без RVM, если деплой настроен на RVM? Давайте еще на сервере без руби его запустим.
Пока писал длиннную притчу, основную мысль сказали в комменте выше =)
Проблема в
require 'rvm/capistrano'

Недавно наткнулся на это, пытаясь задеплоить с машины с rbenv на сервер с rvm. Поскольку rvm локально не был установлен, require вылетал с ошибкой. Проще было перевести сервер на rbenv, чем пытаться это исправить.
Чтобы добавить rbenv в whenever нужно дописать 3 строчки в config/schedule.rb:

set :rbenv_root, "/usr/local/rbenv"
env :PATH, "#{rbenv_root}/shims:#{rbenv_root}/bin:$PATH"
env :RBENV_VERSION, "1.9.3-p0"


С rvm так не выйдет.
set :job_template, «rvm-shell 1.9.3-p0 -c ':job'»
Пардон, тэг code забыл
set :job_template, "rvm-shell 1.9.3-p0 -c ':job'"
Даа, это тяжело:

set :whenever_command, "bundle exec whenever"
set :whenever_environment, defer { stage }
set :whenever_identifier, defer { "#{application}_#{stage}" }


А в config/schedule.rb у меня вообще не в курсе rvm там или rbenv. Там просто написаны задачи на выполнения :)
Как я понял, основной аргумент против rbenv — лишние 50 мс для запуска обёртки (почему именно 50? сколько раз нужно запускать исполняемые файлы, чтоб это было хоть сколько-то заметно?). Между тем сложность решения с rvm выше.
Кстати, в rvm уже исправили проблему с «висом» mc при переходе в каталог с недоверенным .rvmrc? И исправима ли она в принципе без отключения .rvmrc?
2. Перегружает команды оболочки, такие как cd. Это опасно и может привести к ошибкам.

И это регулярно и приводило к проблемам. И закончилось тем что автор выключил фичу про доверие к новым файлам .rvmrc. Вот коммит github.com/wayneeseguin/rvm/commit/9a9fef58731e822b03789445a859fcdb69e57fff и он был сделан примерно через пару дней после релиза первой версии rbenv.
5. Управляет gemset'ами. Bundler — лучший способ управлять зависимостями приложения. Если проект ещё не использует Bundler, есть возможность установить плагин rbenv-gemset. Использование gemset'ов опционально, но рекомендовано, так как оно упрощает процесс разделения. Само существование плагина rbenv-gemset только подтверждает это. Даже могучий Bundler не всегда может разобраться в запутанных отношениях gem'ов. Ко всему прочему, не всегда удобно запускать Rake вызывая 'bundle exec rake'.

Кого не устраивает писать каждый раз bundler exec могут поставить mpapis.github.com/rubygems-bundler/ и писать после только .
Полезная и удобная штука, однозначно. Вроде как и хак, а вроде как и сахар просто.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации