使用 RVM 编写脚本
由于 RVM 的编写方式,rvm 不仅可以在命令行中运行,而且也适合用于编写脚本。 当编写依赖于使用 rvm 命令行界面来切换 Ruby 和/或 gemset 的脚本时,您需要记住与正常使用相比,有一个重要的区别。
请阅读并理解下面的二进制模式与函数模式。
二进制模式与函数模式
RVM 可以以两种不同的模式运行 - 默认情况下,如果 rvm 二进制文件在您的路径中可用/使用绝对路径,RVM 将以二进制文件运行。 这意味着 rvm 可以执行大多数操作的大部分(例如安装 Ruby、调用设置操作),但某些操作(例如切换当前 Ruby)将失败,因为它无法更改其运行的环境。
当 RVM 用作 shell 函数时(通过在您的 shell 配置文件中或在脚本的情况下直接在您的脚本中,通过源代码脚本/rvm 文件),它获得了操纵其运行环境的能力 - 也就是说,rvm use 和 rvm gemset use 按预期运行,切换 GEM_HOME、PATH 和其他用于正常操作的各种环境变量。
脚本
由于您可以以两种模式运行 RVM,因此您的第一个选择是作为二进制文件运行,使用 rvm do 在指定的环境中执行一个命令。
例如,要在任何环境中创建一个 gemset
rvm 1.8.7-p334 do rvm gemset create my_gemset
第二个选择(这可能是您需要的)是添加一个源代码行,与您在交互式登录 shell 的配置文件中添加的相同。
例如,对于用户安装的 RVM
\# 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
在上述代码出现在 bash 或 zsh 脚本中后,您将能够使用影响脚本其余部分环境的正常 rvm 命令。
如果您想查看 rvm 是否已正确加载为 shell 函数而不是二进制文件,您可以在脚本中插入以下行。
type rvm | head -1
如果上述行输出“rvm is a function”,则一切正常。如果输出“rvm is hashed”或“rvm is $rvm_path/bin/rvm”甚至“not found”,则它在脚本中以二进制文件形式运行或根本没有运行,并且无法按预期控制脚本的环境。
如果您正在编写脚本,并且遇到 ruby 在脚本内部没有“正确切换”的情况,那么 rvm() 函数没有加载到 shell 中,而是一个二进制文件。
更多资源
有关更多信息,请参阅 此 gist