无法通过shell脚本使用`rvm gemset use`更改RVM gemset

12

(见底部更新)


我感觉自己很明显地错过了什么,但是我无法在shell脚本中更改gemsets。这个最小化的脚本演示了:

#!/usr/bin/env bash

rvm gemset use "testing"

我甚至尝试了Scripting RVM page上的说明(尽管似乎并不必要):

#!/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"

仍然不行。

有趣的是,如果我在创建"testing" gemset之前尝试运行脚本,我会得到ERROR: Gemset 'testing' does not exist, rvm gemset create 'testing' first.错误。但是,如果我创建了gemset然后再运行脚本,脚本没有输出,并且gemset没有改变(根据rvm info)。我能够执行其他RVM gemset操作,例如在脚本内创建gemset和信任.rvmrc文件。

[更新]

当然,环境是在改变的,这可以通过从脚本中调用rvm info来表示。如何使这些更改持久化/影响调用shell?或者,如果这不可能(如此处所示),是否有任何方法可以基于脚本输入设置当前的RVM gemset?


你的标题显示你在使用反引号。你真的在使用它们吗?你知道这意味着命令替换吗?任何来自该命令的输出都必须以varName=value的形式才有用(还需要一个前置eval)。祝你好运! - shellter
不是的,我只是在标题中使用它们来表示一个命令。 - Michelle Tilley
3个回答

20

我之前遇到了完全相同的问题,以下是解决方案:

#!/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

我发现你的交互式shell中有rvm()及其辅助程序,而脚本的环境中没有它们。相反,执行了rvm二进制文件,部分工作,因此导致一些混乱。

谢谢!这个问题困扰我很久了,涉及到我的Jenkins/Capistrano部署!我太困惑了!干杯。 - Harmon
谢谢!这也帮助解决了在脚本中切换 Ruby 版本(例如“rvm system”)无法工作的问题。 - Henrik N
1
如果您不想添加 [ -s "$HOME/.rvm/scripts/rvm" ] && . "$HOME/.rvm/scripts/rvm",则 #!/bin/bash --login 也可以解决问题。 - User128848244

1

最终我实现了所需的功能,作为一个函数而不是一个 shell 脚本。

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

谢谢 - 这解决了我很多问题,而且可以与其他东西一起使用。当你在这里展示它时,似乎很明显,但我已经折腾了几个小时! - Richard Jordan

0

RVM无法正确加载,因为它加载在您的.bashrc.bash_profile上,在登录时运行。

您可以使用登录shell运行rvm gemset use

bash -l -c "rvm use RUBY_VERSION@GEMSET_NAME"

希望能对你有所帮助!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接