Отношения между Rubygems, Bundler и RVM - PullRequest
29 голосов
/ 06 декабря 2010

Какова текущая передовая практика, какова роль каждого из них?

Исходя из моего ограниченного понимания Bundler и RVM, кажется, что у них - как у Rubygems - есть свои собственные места установки для драгоценных камней. Кроме того, для каждого есть возможность установки по системным путям, используя sudo или в ваш домашний каталог. И затем есть возможность продавать драгоценные камни с Bundler (где это применимо, например, с Rails).

Так что мне кажется, что сейчас есть как минимум семь мест для установки гемов:

  • Системный путь Rubygems
  • путь пользователя Rubygems
  • Системный путь RVM
  • Путь пользователя RVM
  • Путь к системе Bundler
  • Путь пользователя Bundler
  • Поставщик (за приложение)

Итак, как лучше всего управлять всем этим? Используем ли мы все три (Rubygems, Bundler, RVM) и говорим им всем, чтобы установить гемы в одном месте? Используем ли мы sudo все время, иногда или никогда? И должны ли мы использовать другую стратегию на машинах производства и разработки?

В соответствующей заметке, являются ли обертки Bundler и RVM вокруг Rubygems, являются ли они альтернативами или они полностью ортогональны ему?

Ответы [ 2 ]

32 голосов
/ 06 декабря 2010

С сайта Bundler :

Bundler позволяет легко убедиться, что ваше приложение имеет зависимости, необходимые для запуска и запуска без ошибок.

Это означает, что для какого-то другого разработчика или для вас, находящегося на другой машине, тривиально подготовиться к дальнейшей разработке или использовать его, запустив bundle install, и у вас есть все, что нужно для запуска и запуска.

RVM предназначен для управления несколькими версиями Ruby на одном компьютере и переключения между ними.Gemsets - это мощная функция, предоставляемая RVM, которая изолирует гемы для одного приложения / библиотеки от остальной части вашей системы.

При использовании вместе RVM и Bundler RVM сообщает Bundler, куда должны идти гемы, и Bundler устанавливает их вRVM-папка.

Оба (что касается гемов в случае с RVM) используют и зависят от Rubygems, поэтому они наиболее близки к оболочкам.

Лично я использую Bundler и RVM для всехмои проекты.Никаких наборов гемов, только Bundler для решения и исправления ошибок, что он делает в обязательном порядке.Установка драгоценных камней выполняется без sudo и заканчивается в том месте, которое определяет RVM.Установка Ruby по умолчанию в моей системе осталась одна, и в Rubygems system / user path ничего не устанавливается

3 голосов
/ 06 декабря 2010

То, как я это делаю сейчас (хотя и немного экспериментирую), таково:

  1. Используйте RVM для настройки версии ruby ​​и набора гемов для приложения.Я использую .rvmrc-файл в корне каталога приложения, чтобы убедиться, что правильный ruby ​​и gemset используются постоянно.

  2. Bundler устанавливается с использованием gem без sudo в даннойgemset.

  3. Любые драгоценные камни, необходимые для приложения, добавляются в Gemfile приложений и устанавливаются с помощью Bundler.Для этого я не использую sudo.

Таким образом, я использую Bundler для отслеживания зависимостей для каждого приложения и RVM для изоляции гемов каждого приложения друг от друга.Работает действительно гладко, на самом деле.

Я еще не установил RVM на моем сервере развертывания, там я просто использую Bundler, чтобы убедиться, что все зависимости приложений обрабатываются.Вероятно, я также установлю RVM там, но сначала нужно выяснить, как он играет в мяч с Пассажиром.

Что касается вашего последнего вопроса, Bundler - обертка вокруг драгоценного камня, RVM просто манипулирует гемпатом, где установлены драгоценные камни.,Кажется, он достаточно умен, чтобы собирать драгоценные камни из того же места, поэтому мне не нужно перекомпилировать те, которые уже установлены в другом наборе.

Я перестал использовать sudo для установки драгоценных камнейпосле начала использования RVM.Там действительно нет никаких причин, просто установить их в пути пользователя rvm.Я не уверен насчет лучшей практики, если у вас на одной машине больше разработчиков, таких как тестовый сервер или что-то в этом роде.

...