Пользователь
31 января 2012 в 13:02

Разработка → Когда нужен RVM, а когда достаточно rbenv из песочницы

Ruby*
В данной статье я не буду вдаваться в подробности работы RVM и rbenv. Информации по данным штуковинам хватает на просторах интернета. Здесь же я хочу попытаться раскрыть вопрос: когда стоит использовать rbenv, а когда нет?

Цель


Для этого давайте для начала разберемся для чего же создавался RVM, а для чего rbenv. Для этого достаточно взглянуть на возможности обоих систем.

Возможности rbenv


  • Установка различных версий ruby
  • Удаление их по отдельности
  • Изменение версии ruby в системе
  • Изменение версии ruby для конкретного проекта
  • Установка гемов для текущей версии ruby в систему (точнее в путь установки текущей версии ruby)


Это все возможности к сожалению к счастью. Хочу добавить от себя, что большего и не нужно.

Возможности RVM

Так как возможностей очень много (все можно посмотреть на официальном сайте) то здесь я приведу основные.
  • Установка различных версий ruby
  • Удаление их по отдельности
  • Установка гемсетов
  • Удаление гемсетов
  • Перекличение между версиями ruby в системе
  • Перекличение между гемсетами в системе
  • Создание конфигурации ruby или гемсета для конкретного проекта


На этом остановимся. Список будет в 2 раза больше из-за того, что RVM поддерживает не только манипуляции с ruby, но и с гемсетами.

Зачем нужны гемсеты?


Когда bundler’а не было на свете, все гемы, нужные для проекта, ставились в систему и смешивались с гемами, используемыми другим проектом. В итоге мы получали кашу с различными гемами различных версий, проект использовал гем не той версии при запуске и падал, а то еще хуже — заводился и работал не так как хотелось бы, либо вовсе гем не включался в проект по непонятным причинам. Альтернативным путем решения было конечно замараживать их в vendor/, но это решение не позволяло обновлять гемы (это нужно было делать вручную), да и проект весил в несколько раз больше. С появлением bundler появилась возможность ставить гемы необходимые для проекта куда угодно (для этого нужно передать в bundle install переменную --path), причем эти гемы никак не повлияют на работу другого проекта. В итоге мы получаем то, что делает за нас RVM — рабочую лошадку по управлению гемсетов, но для этого нам не нужен RVM!
В этом и кроется ответ на главный вопрос этого поста. В последнее время сложно найти проект, в котором не используется bundler. Если Вы используется bundler во всех проектах, использование RVM теряет смысл.

Как я использую rbenv


Допустим мы имеем два проекта A(rails 3, ruby 1.9.1) и B (rails 2, ruby 1.8.7), в системе установлен rbenv с этими версиями ruby. Мои действия:
  • Захожу в путь проекта B
  • Выполняю rbenv local 1.8.7. Это создаст файл .rbenv-version и теперь при нахождении в этой директории версия ruby будет устанавливаться из этого файла
  • bundle install --path=vendor/bundle. Это заморозит гемы, описанные в Gemfile в путь ./vendor/bundle
  • Делаю тоже самое с проектом A, устанавлявая версию 1.9.1


Это все. В итоге мы имеем 2 проекта с разными, не пересекающимися, наборами гемов для различным версий ruby. Если мы зайдем в проект A, у нас автоматически установится в оболочке ruby 1.9.1. При запуске сервера будет использоваться ruby 1.9.1 и набор гемов из vendor/bundle.
Огромный плюс в том, что мы можем без особых проблем анализировать исходный код гемов и изменять их, если это конечно необходимо. Я считаю, плюс в том, что исходный код всех гемов будет лежать в проекте, а не где-то там, очевиден и не требует подробного объяснения и разбора полетов.

Зачем тогда RVM?


Рационально использовать RVM получается только в одном случае: если в проектах не используется bundler.
Колешко Андрей @ka8725
карма
0,0
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Спецпроект

Самое читаемое Разработка

Комментарии (29)

  • 0
    RVM можно применить во всех случаях, тогда зачем вообще нужен rbenv? Скорость работы?
  • 0
    Для неопытного пользователя проще разобраться в rbenv. Плюс к тому же rbenv шустрее работает. Т.к. в последнее время все проекты идут с bundler (в rails 3.2 вовсе исключили возможность использовать vendor/plugins), то фича гемсетов rvm бесполезна, соответственно тратить время на то, как она работает в rvm, не стоит.
    • +3
      Вы всё правильно говорите. Но есть одно НО!
      Рельсы это не всё руби.
      Для разработки проектов именно на руби и помогают гемсеты.
      И причем идет речь об машине девелопера, у которого без гемсетов в gem list будет туева куча гемов.
      Сделал проект — удалил гемсет, освободил место на ноуте. Всё просто и удобно.
      • +4
        В любом проекте можно использовать bundler, не только в rails
        • –1
          так используется. но как-то на локалькой тачке куда класть гемы? в папку проекта? зачем?
          • 0
            Для дебага и изучения исходного кода гемов. Если гемы плохо документированны, очень помогает. Да и вообще, помогает это еще в изучении работы гемов
            • 0
              а чем то, что вы кладете гемы в паку проектов, упрощает просмотр их исходного кода?

              В RubyMine они у вас показываются в папке проекта, а перейти можно по команде Go to File
              в консоли — cd `gem which имя_гема`
              • 0
                Если в RubyMine такая фишка есть — это очень хорошо. Но во многих IDE, к сожалению, нет
                • 0
                  $ gem install gem-open
                  $ bundle exec gem open gem-i-want-to-see-sources-of
            • +1
              Есть такая команда bundle open gem name ( например bundle open rails) открывает в $EDITOR гем который прописан в текущем Gemfile
          • 0
            В место по умолчанию, куда ставит gem install. Bundler при bundle exec из всё кучи джемов использует только те, что прописаны в Gemfile.lock, поэтому никаких конфликтов не будет.
  • 0
    rbenv/RVM это что-то типа virtualenv, только для руби?
    • 0
      Да
  • +2
    ИМХО
    rbrnv — достаточно в большинстве кейсов как для разработки так и для продакшена, и устроен проще в случае проблем можно и самому разобраться.
    rvm — довольно сложен и понять что проблема именно rvm можно не сразу.
  • 0
    Полностью перешел с rvm на rbenv и вздохнул с облегчением, такого костыля (rvm) давно не видел.
    Единственная проблема в продакшене с rbenv — это один ruby для всего пассажира, что не всегда гуд.
    • 0
      А если попробовать в passenger_ruby указать ~/.rbenv/shims/ruby и в каждом проекте сделать local ruby?
      • 0
        не пробовал, но думаю нужен абсолютный путь
        • 0
          Путь аболютный нужен — это же не проблема ~ назменить на /home/user. Есть еще альтернатива passenger — это unicorn. С ним проблем в настройке разных версий ruby на разных проектах не будет.
          • 0
            с shims не работает. за unicorn спасибо кеп.
    • 0
      У Passenger есть Standalone mod
      Можно юзать на одном сервере несколько пасажиров с разным ruby.
      • 0
        да, это выход, как и заюзать unicorn/mongrel/etc
  • 0
    а нужно ли новичку «разбираться в» том или другом? для новичка будет гораздо подезнее писать код для стабильного руби и текущей версии библиотек. rvm просто работает и не стоит тут писать о лёгкости для новичков. напишите лучше какую проблему в работающем rvm решает rbenv. и если это скорость, тогда где тесты?
    • 0
      Да, для новичка будет проще. Но как ни странно у многих новичков стоит rvm, который, как оказывается, им вовсе не нужен. Они тратят попусту время на изучение штуки, которая уходит в небытие с каждым днем. Кстати, используют они его потому что в самом авторитетном учебнике по изучению Rails автор настоятельно рекомендует использовать его.
      PS. А еще в rbenv можно переключиться на системный ruby без особых проблем, не перезагружая shell и ничего не редактируя: rbenv global system
      • 0
        rvm use system
  • +1
    Если верить комментам, то походу я тут единственный, кого устраивает и кому кристально понятен столь удобный и простой тул — RVM. Но ведь нас на самом деле много? :-)
    • +1
      Поддежриваю, кучу времени использую rvm и не вижу ни одной причины перейти на rbenv:)
      • 0
        К тому же есть JewelryBox, rvm gui unfiniti.com/software/mac/jewelrybox
      • 0
        У меня rvm работает в нескольких проектах на нескольких серверах. Изучен вдоль и поперёк. Всё работает как часы.

        rbenv — пока вот пробую поставить — непонятный велосипед, нужен бубен.
  • 0
    Разве
    $ rvm --rvmrc --create 1.9.1@project
    $ bundle install --path vendor/bundle

    не то же самое, что rbenv local?

    Советую тоже прочесть.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.