Управление разными версиями Rails в разных ветках git с помощью RVM - PullRequest
1 голос
/ 13 сентября 2011

Я работаю над проектом, который выполняется на Rails ~> 3.0 в ветви master и ~> 3.1 в другой ветви.

Очевидно, что эти 2 ветви нуждаются в разных наборах гемов.

Вам известен удобный способ справиться с ситуацией с помощью RVM?

Я подумал о паре вариантов, ни один из которых не является оптимальным:

  • используя gemset s Я должен помнить, чтобы вручную переключать gemset после каждого git checkout

  • , используя bundle package Я быдля отслеживания каталога vendor/bundle

  • сочетание двух подходов даже невозможно, поскольку .bundle/config не отслеживается

  • Iмог бы написать git post-checkout хук, но это звучит немного странно (жестко закодированные имена веток и все такое)

Есть ли лучший способ, о котором я не могу придумать

Ответы [ 5 ]

1 голос
/ 13 ноября 2011

Я использовал следующий скрипт git post-checkout.В ветке master я использовал гем, установленный в $GEM_HOME.В других филиалах драгоценные камни были установлены локально на vendor/cache.

#!/usr/bin/env bash

#set -x

git_rev() {
  ref=$(git symbolic-ref HEAD 2>/dev/null) || return
  echo ${ref#refs/heads/}
}

ref=$(git_rev)

case $ref in
  master)
    echo "removing .bundle/config"
    mv .bundle/config .bundle/config.no
    ;;
  *)
    if [ -f .bundle/config.no ] ; then
      echo "using vendor/cache"
      mv .bundle/config.no .bundle/config
    fi
    ;;
esac
1 голос
/ 13 сентября 2011

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

Однако, поскольку это изменение в каталоге rvmrc, а изменение в .rvmrc не обнаружено, вы можете принудительно его изменитьвыполнив «перезагрузку RVM».Изменение должно быть получено, но если это не так, выполните перезагрузку.

Пожалуйста, напишите о любых проблемах, которые у вас возникли после этого, в https://github.com/wayneeseguin/rvm/issues

Спасибо,

Дерил Р. Дусетт

ПРИМЕЧАНИЕ: После разговора с Уэйном он передал мне через IRC, что он порекомендует вам сделать что-то вроде этого вваш .bash_profile, чтобы помочь в том, что вы хотите:

  git() { command git "$@" ; [[ -s .rvmrc ]] && . .rvmrc ; }

Кроме того, как вы понимаете, RVM не работает как демон в какой-либо форме или форме.Поэтому то, что вы хотите, чтобы RVM делал наиболее определенно, будет , а не , добавленным в RVM.Как сказал Уэйн, это был бы забавный способ поиграть с чьей-то головой!:)

Думайте об этом так.Хотя по общему признанию надуманный, действие все еще то же самое.Что делать, если кто-то меняет rvmrc под вами, когда вы находитесь в середине чего-то (другой разработчик работает над директорией и не знает, что вы), или какой-то изгоев взломал вашу систему и изменил вашу rvmrc на вас, думая, что он можетсделав таким образом некоторые дополнительные привилегии.(Это может быть в управляемом группой каталоге проекта, где он получил доступ через учетную запись другого пользователя, выясняет, что вы находитесь в той же группе, меняет rvmrc под вами на другой набор ruby ​​+ gemset, который ему удалось настроить с помощью групповых разрешенийгруппа RVM в многопользовательской установке и вызывает выполнение некоторой произвольной команды. Представьте себе, что вы находитесь , скажем, в группе wheel, и вы только что завершили выполнение некоторой команды для пользователя root и тайм-аутаеще не завершено для уменьшения авторизации. Поскольку rvmrc на самом деле не более чем сценарий bash, это не так уж далеко от воображения. Так что, в конце концов, это создает ОЧЕНЬ опасную среду, не говоря уже о чрезвычайно сложной ситуацииконтроль и управление.

1 голос
/ 13 сентября 2011

Вы можете создать файл .rvmrc внутри директории вашего проекта и добавить его в репозиторий git.Для одной ветви файл .rvmrc будет содержать строку типа

rvm 1.9.3-head@rails30 --create

, для другой ветви он будет содержать

rvm 1.9.3-head@rails31 --create

Таким образом, вы получите два набора гемов (рельсы30 и рельсы31).Также не забудьте активировать автоматическое выполнение файлов .rvmrc в вашем {home} /. Rvmrc (необходимо для последней версии rvm, см. Документацию по rvm).

0 голосов
/ 11 марта 2012

Чтобы следовать ответу morgler, если у вас есть ваш .rvmrc, зарегистрированный в вашем проекте git, вы можете использовать git complete, чтобы добавить имя ветви git в имя набора гемов .rvmrc, чтобы автоматизировать создание набора гемов для каждой ветви, например:

PROJECT_NAME="my_app"
RUBY_VERSION="ruby-1.9.2-p290"
GEMSET_NAME="${PROJECT_NAME}"
# if you have bash completion setup the way I do, you get a gemset for each git branch
if [ -f /usr/local/etc/bash_completion.d/git-completion.bash ]; then
  . /usr/local/etc/bash_completion.d/git-completion.bash;
  GEMSET_NAME="${PROJECT_NAME}-$(__git_ps1 '%s')";
fi
rvm --create "${RUBY_VERSION}@${GEMSET_NAME}"

(Примечание: вам, вероятно, придется изменить это. Это работает для меня в OS X, но я уже использовал git complete для моей терминальной подсказки .)

Затем перейдите в каталог и, если вы выполните список gemset rvm, вы увидите, что gemset создан для этой ветви git.Единственный сбой в том, что после того, как вы создадите новую ветку git, вам понадобится cd-out и в каталоге, чтобы он мог распознавать другой gemset, созданный в .rvmrc (даже если .rvmrc - это один и тот же файл, он будет себя вестииначе).

Это не идеальное решение, и все в проекте должны быть в курсе этого.Если вы поместите .rvmrc для одного проекта, вам следует рассмотреть возможность его использования для всех них, в противном случае, просто перейдя в каталог, можно изменить версию ruby ​​и gemset, а затем, если вы вернетесь к другому проекту, который не 'у него нет .rvmrc, вы можете не заметить, что он изменился, и возникли проблемы.

Редактировать: Михал Папис упомянул , что:

Возможное решение для этого было бы использовать .versions.conf, представленный здесь: https://gist.github.com/1912050#gistcomment-86575 - должно быть легко поставить флаг -> ruby-gemset-git-branch, который добавит ветку к имени gemset, если отличаетсязатем мастер

0 голосов
/ 16 сентября 2011

Используйте rbenv вместо RVM. Тогда вы будете полностью управлять своими драгоценными камнями с помощью Bundler.

Измените ваш Gemfile, чтобы одна ветвь предназначалась для Rails 3, а другая - для Rails 3.1.

Затем запустите bundle exec rails server при запуске WEBrick, и упаковщик будет использовать ту версию Rails, которая вам нужна. Сохраняет вещи СУХИМ;)

Прочитайте мое короткое вступление к , чтобы начать работать с rbenv .

...