0

我正在尝试使用 Puppet 在各种系统上设置 RVM。在我尝试指定要使用的 Ruby 之前,一切正常。

使用 Puppet exec运行rvm use 1.9.3会产生错误,因为“rvm 不是函数”,因为 Puppet 的 exec 会强制所有命令完全限定。

我将如何使用 Puppet 通过 RVM 设置系统 Ruby?这甚至可能吗?

4

2 回答 2

3

当你安装时,rvm你需要source rvm.sh为了让它立即工作。此文件的确切路径通常在安装消息中披露。

于 2013-08-22T18:19:37.573 回答
2

您收到了很好的错误消息,它告诉您 RVM 不能以交互方式使用。这意味着即使 RVM 忽略了问题并设置了当前的 ruby​​,它也没有任何意义,因为将 RVM 作为二进制文件运行是 shell 的单独执行,它将无法设置父进程(shell / puppet)环境。为了能够设置环境,RVM 必须作为函数加载到 shell 中,以便它可以更改当前进程的环境。

所以有几种方法可以使它工作:

  1. 带有多个命令的子shell:

    bash -c "source ~/.rvm/scripts/rvm ; rvm ..."
    
  2. RVM 集合操作:

    ~/.rvm/bin/rvm {ruby-name} do {command}...
    
  3. 某些操作不需要上述技巧(例如设置默认 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

这将创建:

  1. 一个别名 - 因此很容易引用应用程序 ruby​​,并且不需要在脚本中更改来更改 ruby​​ - 只需更新别名
  2. 为安装在该 ruby​​ 中的所有 gem 创建包装器 - 包括用于rubygem命令的包装器
  3. PATH=...在任何应该为您的应用程序使用 ruby​​ 的脚本之上添加。
于 2013-08-23T06:51:17.160 回答