Невозможно изменить gemset RVM из сценария оболочки через `использование gemset rvm` - PullRequest
12 голосов
/ 26 апреля 2011

.Этот минимальный скрипт демонстрирует:

#!/usr/bin/env bash

rvm gemset use "testing"

Я даже попробовал инструкции со страницы Сценарии RVM (хотя это и не казалось необходимым):

#!/usr/bin/env bash

# Load RVM into a shell session *as a function*
if [[ -s "$HOME/.rvm/scripts/rvm" ]] ; then
  # First try to load from a user install
  source "$HOME/.rvm/scripts/rvm"
elif [[ -s "/usr/local/rvm/scripts/rvm" ]] ; then
  # Then try to load from a root install
  source "/usr/local/rvm/scripts/rvm"
else
  printf "ERROR: An RVM installation was not found.\n"
fi

rvm gemset use "testing"

Тем не менеенет.

Интересно, что если я попытаюсь запустить сценарий, не создав сначала «тестовый» набор гемов, я получу ERROR: Gemset 'testing' does not exist, rvm gemset create 'testing' first. Однако, если я создаю набор гемов и затем запускаю сценарий, я не получаю выводиз скрипта и гемсета не изменяется (согласно rvm info).Я могу выполнить другие RVM-действия с наборами гемов, такие как создание наборов гемов и доверять .rvmrc файлам, из скрипта.

[Update]

Конечно, среда меняется , как указано вызовом rvm info из скрипта.Как заставить эти изменения сохраниться / повлиять на вызывающую оболочку?Или, если это невозможно (как указано здесь ), есть ли способ установить текущий набор гемов RVM на основе ввода в скрипт?

Ответы [ 2 ]

20 голосов
/ 05 июля 2011

Была точно такая же проблема, и вот решение:

#!/bin/bash

# IMPORTANT: Source RVM as a function into local environment.
#            Otherwise switching gemsets won't work.
[ -s "$HOME/.rvm/scripts/rvm" ] && . "$HOME/.rvm/scripts/rvm"

# Enable shell debugging.
set -x

rvm 1.9.2@gemset_a
rvm gemdir
gem env gemdir

rvm 1.9.2@gemset_b
rvm gemdir
gem env gemdir

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

1 голос
/ 26 апреля 2011

В итоге я реализовал желаемую функцию как функцию вместо сценария оболочки.

function rvmrc {
  rvm gemset create $1
  rvm gemset use $1
  echo "rvm gemset use $1" > .rvmrc
  rvm rvmrc trust
}
...