rbenv: Выжить без драгоценных камней

TL;DR

  • Не беспокойтесь о гемсетах; несколько версий драгоценного камня могут быть установлены одновременно.
  • При необходимости укажите, какую версию выполнять, используя нотацию $ gem-based-binary _version_ args.
  • Используйте bundle exec, когда у вас есть Gemfile, указывающий версию.
gem install rails -v 3.2.13
rails _3.2.13_ new Project2
cd Project2
bundle exec rails server

ОБНОВЛЕНИЕ:04.06.2015

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

Мое ложное предположение: одновременно может быть установлена ​​только одна версия гема, поэтому гемсеты нужны для изоляции пространства имен. Не правда. Несколько версий драгоценного камня могут быть установлены одновременно. Самый последний из них будет использоваться при вызове из командной строки, если только у вас нет Gemfile, указывающего ограничения версии и вызывающего команду через bundle execили не указывающего версию в качестве первого аргумента.

См. также Как я могу вызвать более старую версию драгоценного камня из командной строки?re: обозначение версии с подчеркиванием.


Исходный вопрос:

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

ВОПРОС:Какова лучшая текущая практикадля создания нескольких проектов rails, каждый из которых использует свою версию rails, при использовании rbenvи упаковщика , в отличие от rbenv-gemset или rvm?

СЛУЧАЙ ИСПОЛЬЗОВАНИЯ:У меня есть два проекта rails, называемые ProjectA и ProjectB. ProjectA разработан с использованием одной версии rails ("RailsA"), тогда как ProjectB использует другую версию ("RailsB"). Как мне установить обе версии?

ПОДХОД GEMSETS:Когда я впервые начал разрабатывать Rails, я использовал RVM. Помимо поддержки нескольких одновременных установок ruby, RVM поддерживает несколько именованных наборов Gem . У каждого проекта есть своя независимая коллекция гемов (включая сами рельсы), называемая гемсетом:

rvm gemset create RailsA
rvm gemset use RailsA
# RailsA.  Note: My question is not version-specific.
gem install rails --version 3.0
rails new ProjectA
cd ProjectA
rvm --rvmrc use `rvm current`
vi Gemfile
bundle install
cd ..
## Now do the same for ProjectB
rvm gemset create RailsB
rvm gemset use RailsB
gem install rails --version 3.2
rails new ProjectB
cd ProjectB
rvm --rvmrc use `rvm current`
vi Gemfile
bundle install

Примечание: само созданиепапок проекта должно выполняться (ИМХО) с помощью rails newс использованием нужной версиирельсов, поскольку файлы скелета меняются от версии к версии. (Возможно, мне следует вернуться к этой предпосылке?)

ПОДХОД СОСТАВЩИКА:Я экспериментировал с использованием rbenvвместо RVM, но я не так ясно понимаю рабочий процесс. В README.mdСэм Стефенсон пишет, что «rbenv не... управляет гемсетами.Bundler — лучший способ управлять зависимостями приложений». Существует плагин ( rbenv-gemset) для получения тех же результатов, что и гемсеты rvm, но Сэм явно предпочитает вместо этого использовать Bundler. К сожалению, он не уточняет. о том, как будет выглядеть рабочий процесс. Даже веб-сайт Bundlerявно не связывает все точки, как изолировать один проект от другого. Несколько блоговисутьприходят на помощь, предлагая следующий файл ~/.bundle/config:

---
BUNDLE_PATH: vendor/bundle

(Кстати, я не уверен, что такое "---". В документах не упоминается это, и это, кажется, не имеет значения.)

Это фактически дает каждому проекту rails свой собственный набор драгоценных камней, сохраняя драгоценные камни в ProjectX/vendor/bundle/. Фактически, сами рельсы будут (пере-)установлены там , делая проект полностью независимым от остальной части моей среды, как только я запускаю bundle install,

Но слон в комнате— это курица nd-egg проблема создания папки проекта rails на первом месте !!Чтобы создать папку ProjectA с помощью RailsA, мне нужно сначала установить rails (и их многочисленные зависимости) . Но когда я хочу создать ProjectB, я должен переключиться на использование RailsB. Без драгоценных камней я должен сделать серьезное обновление / понижение версии. Не круто.

Возможное решение — просто не беспокоиться о том, какую версию рельсов я использую для создания папки ProjectX. Если я затем использую rails 3.0 для создания проекта 3.2, я могу просто вручную создать дерево приложений/ресурсов. Но это только раздражает меня.Разве нет лучшего способа?

43
задан Community 23 May 2017 в 11:46
поделиться