rbenv: выжить без gemsets

TL; DR

  • не беспокойтесь о gemsets; несколько версий драгоценного камня могут быть установлены одновременно.
  • при необходимости укажите, какую версию выполнить с помощью $ 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

обновление: 2015-06-04

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

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

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


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

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

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

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

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

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

Примечание: очень создание из папок проекта должно быть сделано (IMHO) с помощью С помощью нужную версию рельсов, так как файлы скелета меняются от версии к версии. (Возможно, мне следует вернуться к этой предпосылке?)

ПОДХОД BUNDLER: Я играл с использованием rbenv вместо RVM, но я не понимаю рабочий процесс так ясно. В README.md, Сэм Стивенсон пишет ,что " rbenv не делает ... управление gemsets. Bundler-лучший способ управления зависимостями приложений."Есть плагин (rbenv-gemset) для получения тех же результатов, что и наборы драгоценных камней rvm, но Сэм явно предпочитает использовать Bundler. К сожалению, он не уточняет, как будет выглядеть рабочий процесс. Даже упаковщик сайт явно не соединить все точки, как изолировать один проект от другого. Несколько блоги и gists прийти на помощь, предложив следующее :

---
BUNDLE_PATH: vendor/bundle

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

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

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

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

3 ответов


Предположим, у вас установлен rails 3.1.0, но вы хотите создать новый проект с помощью rails 3.2.13, который не установлен.

предположим, вы хотите, чтобы новый проект был в ~/projects/Project2.

gem install rails -v 3.2.13
cd ~/projects
rails _3.2.13_ new Project2

этой Gemfile для вас заблокирована версия rails, которую вы указали в командной строке.

я намеренно опустил идею сохранить отдельную копию gems для нового проекта, потому что это противоречит философии Bundler, который должен иметь все драгоценные камни, установленные в одном месте. Когда вы запустите rails, Bundler автоматически выберет правильные версии gem из этого центрального местоположения. Это означает, что проект может делиться драгоценными камнями вместо установки новой копии для себя. (Обратите внимание, однако, что каждая версия ruby, которую вы устанавливаете, будет иметь свои собственные драгоценные камни. Это хорошо, потому что собственные расширения, вероятно, не будут работать в версиях ruby.)

вы должны быть немного более осведомлены, потому что большинство команд, как rake, загрузит новейшую версию rake что вы установили. Вам нужно бежать bundle exec rake ... чтобы убедиться, что загружена правильная версия. Обычно я бегу bundle exec для всех команд, кроме rails. Вы можете создать псевдоним, чтобы сделать его Короче (я использую bex). Чтобы автоматизировать это с исполняемыми файлами gem, вы можете использовать rbenv-binstubs, но вы все равно должны знать, что запуск исполняемых файлов non-gem, таких как ruby и irb не будет автоматически использовать Gemfile.

Sidenote: rails new будет работать bundle install, который будет проверять новые версии зависимостей. Если вы хотите, чтобы bundler попытался использовать установленные драгоценные камни, удовлетворяющие требованиям зависимостей, вы можете пропустить bundle install С rails new --skip-bundle, затем запустить bundle check в приложение реж.

заметка на полях 2: предположим, вы хотите использовать версию ruby для Project2 (например, 2.1.8), которая отличается от версии по умолчанию (например, 2.3.0). В том кейс, беги!--17--> как указано выше, будут установлены драгоценные камни под 2.3.0, что является пустой тратой времени, потому что вам нужно будет установить драгоценные камни снова под 2.1.8. Чтобы решить эту проблему, вы можете заставить команды использовать предпочтительную версию через переменную среды:

RBENV_VERSION=2.1.8  gem install rails -v 3.2.13
cd ~/projects
RBENV_VERSION=2.1.8  rails _3.2.13_ new Project2
echo 2.1.8 > Project2/.ruby-version

вы мог бы использовать rbenv shell чтобы установить переменную, но я рекомендую только, если вы не хотите, чтобы rbenv автоматически переключался на .ruby-version файлы на время этой оболочки. Это очень легко забыть, что у вас есть набор переменных, и когда вы компакт-диск в другой проект, он не будет использовать версию, которую вы ожидаете.


большинство людей решают это, установив rails gem сначала через gem install rails. Если вы по какой-то причине отказываетесь это сделать, вы можете отказаться от автоматического связывания, которое Rails пытается сделать для вас. Это будет работать полностью независимо от вашей системы управления ruby.

mkdir myapp
cd myapp
echo "source :rubygems" > Gemfile
echo "gem 'rails', '3.2.2'" >> Gemfile
bundle install --path vendor/bundle
bundle exec rails new . --skip-bundle

при появлении запроса введите "y", чтобы заменить Gemfile на Rails по умолчанию (или нет, как вы предпочитаете). Затем, как только это будет сделано:

bundle install

вы сделали, и вы boostrapped новое приложение rails с версией вашего выбора без установки драгоценного камня рельсов в rubygems.


есть хороший недавний пост именно на тему gemsets / bundler здесь http://rakeroutes.com/blog/how-to-use-bundler-instead-of-rvm-gemsets/ хороший фон вы можете применить к настройке rbenv.