我正在尝试使用 Puppet 在各种系统上设置 RVM。在我尝试指定要使用的 Ruby 之前,一切正常。
使用 Puppet exec运行rvm use 1.9.3
会产生错误,因为“rvm 不是函数”,因为 Puppet 的 exec 会强制所有命令完全限定。
我将如何使用 Puppet 通过 RVM 设置系统 Ruby?这甚至可能吗?
我正在尝试使用 Puppet 在各种系统上设置 RVM。在我尝试指定要使用的 Ruby 之前,一切正常。
使用 Puppet exec运行rvm use 1.9.3
会产生错误,因为“rvm 不是函数”,因为 Puppet 的 exec 会强制所有命令完全限定。
我将如何使用 Puppet 通过 RVM 设置系统 Ruby?这甚至可能吗?
当你安装时,rvm
你需要source rvm.sh
为了让它立即工作。此文件的确切路径通常在安装消息中披露。
您收到了很好的错误消息,它告诉您 RVM 不能以交互方式使用。这意味着即使 RVM 忽略了问题并设置了当前的 ruby,它也没有任何意义,因为将 RVM 作为二进制文件运行是 shell 的单独执行,它将无法设置父进程(shell / puppet)环境。为了能够设置环境,RVM 必须作为函数加载到 shell 中,以便它可以更改当前进程的环境。
所以有几种方法可以使它工作:
带有多个命令的子shell:
bash -c "source ~/.rvm/scripts/rvm ; rvm ..."
RVM 集合操作:
~/.rvm/bin/rvm {ruby-name} do {command}...
某些操作不需要上述技巧(例如设置默认 ruby):
~/.rvm/bin/rvm alias create default {ruby-name}
额外的解释 - 默认 ruby 不是系统 ruby,它是一个 ruby,将在您获取 RVM 时加载,如果您的目标是在多个地方使用 ruby 的可用性,请使用别名和包装器:
rvm alias create {my_app} {ruby-version}
rvm wrapp {ruby-version} --no-links --all
PATH=~/.rvm/environments/{my_app}:$PATH
这将创建:
ruby
和gem
命令的包装器PATH=...
在任何应该为您的应用程序使用 ruby 的脚本之上添加。