Отношения между Rubygems, Bundler и RVM

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

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

Итак, мне кажется, что сейчас есть как минимум семь мест для установки драгоценных камней:

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

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

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

Ответ 1

От Bundler веб-сайт:

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

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

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

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

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

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

Ответ 2

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

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

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

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

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

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

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

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