Bundler vs RVM vs gems vs RubyGems vs gemsets vs system ruby ​​[закрыто]


102

Я новичок в Ruby и пытаюсь обдумать следующие концепции: сборщик против RVM против драгоценных камней против RubyGems против гемсетов против системного рубца, и я смущен.

Может ли кто-нибудь описать «лучшую практику» того, как мне управлять всем этим при новой установке последней версии Ubuntu? Что мне установить и как все это использовать?

Я предполагаю, что делать это sudo apt-get install rubyне рекомендуется, но я не уверен. Я пробовал это на своей системе в дополнение ко «всем остальным материалам Ruby». Это только усугубляет мое замешательство. Я не говорю о Rails, а просто говорю об обычных гемах Ruby (например, Vagrant, Chef, скрипты).

Ответы:


185

Согласно предыдущему ответу, это довольно много, поэтому считайте это кратким введением.

драгоценные камни - это способ упаковки библиотек Ruby. Для Ruby они такие же, как jar-файлы для Java. Внутри файла гема вы найдете код Ruby (файлы .rb), а также тесты и специальный файл, содержащий информацию о самом геме, такую ​​как его имя, зависимости и версия ( gemspec ). Любой проект Ruby может определять необходимые ему драгоценные камни через Gemfile, в котором просто нужно объявить зависимости. Rubygems - это имя диспетчера пакетов - инструмента, используемого для установки пакетов (в то время как драгоценные камни - это сами пакеты). Rubygems теперь является частью Ruby.

Bundler - это то, что делает управление драгоценными камнями сносным. На основе вашего Gemfile простой вызов сборщика с помощью пакета установки загрузит и установит все необходимые драгоценные камни. Используя стандартную команду gem, вам придется установить каждый из них вручную, используяgem install <gem_name>. Bundler не является частью Ruby (он сам упакован как гем ), но он является «стандартом де-факто» для большинства приложений (вы не найдете многих людей, которые его не используют, и на самом деле нет веских причин не использовать его).

RVM - это инструмент, позволяющий установить несколько версий Ruby на машину, переключаясь между ними при необходимости. Его можно использовать для установки как Ruby 1.8 и 1.9, так и даже «MRI» (Matz Ruby, реализация по умолчанию) и альтернатив (таких как JRuby или Rubinius). Обратите внимание, что RVM не единственный в этом поле, см., Например, rbenv .

Gemset в РВМ представляет собой набор из драгоценных камней , специфичных для данного контекста, как правило , проекта. Это полезно, если вы, например, разрабатываете разные приложения, каждое со своими наборами драгоценных камней, и хотите хранить их отдельно.

system Ruby - это при использовании RVM версия Ruby, установленная на машине (т. е. не через RVM).

Если вы только начинаете, самоцветы и бандлер вам интересны. Вы можете пока оставить в стороне RVM и гемсеты.


1
Хороший ответ, не могли бы вы уточнить: в чем разница между драгоценными камнями и RubyGems? А между gemspec и Gemfile? Кроме того, какие из этих программ (например, сборщик), перечисленных выше, включены в «Ruby», а какие являются отдельными приложениями (я считаю, что RVM является отдельным)? И является ли gemset просто концепцией только в RVM или он также находится в ядре Ruby (или других вещах, таких как rbenv, упомянутых в другом ответе)? И если Bundler упрощает управление драгоценными камнями, как это делалось до сборки? (То есть, как бы вы управляли драгоценными камнями без упаковщика, я знаю, даже если бы я никогда этого не делал.) Спасибо!
user779159

Итак, Rubygems - это имя диспетчера пакетов, который вы вызываете с помощью команды gem? И является ли Bundler частью самого Ruby, как и Rubygems, или мне нужно как-то его включить?
user779159

2
«Если вы только начинаете ... [вы] можете оставить RVM ... пока в стороне». Если вы не работаете в OS X, а проект Ruby, который вы хотите установить и запустить, зависит от более поздней версии Ruby, чем та, которая предустановлена ​​в ОС. Тогда вам понадобится RVM.
Гефест

Это неправда: «Используя стандартную команду gem, вам придется устанавливать каждый из них вручную». Вы определенно можете установить все драгоценные камни в свой гем-файл, используя одну команду "gem install"
Энди

1

Вы запрашиваете больше информации в одном вопросе, чем это предусмотрено в Stack Overflow. Чтобы охватить все это, понадобится книга.

В Ubuntu легко устанавливать и удалять гемы в «системную» версию Ruby, так что привыкайте к установке и удалению обычных гемов через sudo. (В Mac OS я бы дал другой совет, потому что Apple объединяет Ruby для собственного использования, и возиться с ним - не лучшая идея.) Затем, когда вы понимаете, как работает вся идея драгоценного камня, и знаете, что хотите несколько Версии Ruby в вашей системе, попробуйте « rbenv » или « RVM » и установите одну или две версии в свою песочницу.

Linux упрощает добавление / удаление Ruby через дистрибутив, но мы ограничены версиями, которые поставили разработчики дистрибутива, поэтому я обычно устанавливаю из исходного кода. Но это больно при управлении несколькими версиями Ruby для систем разработки, тестирования и производства, поэтому были изобретены rbenv и RVM - они обрабатывают грязные детали, позволяя нам сосредоточиться на программировании.

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

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


1
Никогда не используйте sudo какой-либо менеджер пакетов, кроме вашего системного менеджера пакетов по умолчанию (например, apt или apt-get). Вы неизбежно испортите свою систему.
изображение
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.