ruby - VagrantFile 内联脚本和 rvm 配置

标签 ruby rvm vagrant provisioning vagrantfile

我正在尝试使用以下脚本在 vagrant 文件中使用 rvm 在 vagrant 用户中设置 versión ruby​​ 版本:

 config.vm.provision "shell", inline: <<-SHELL
     sudo apt-get -y update
     sudo apt-get -y install git ruby libgdbm-dev libncurses5-dev automake libtool bison libffi-dev
 nodejs
     #Install ruby environment
     curl -sSL https://rvm.io/mpapis.asc | gpg --import -
     curl -L https://get.rvm.io | bash -s stable
     sudo "source ~/.rvm/scripts/rvm"
     echo "source ~/.rvm/scripts/rvm" >> ~/.bashrc
     sudo /usr/local/rvm/bin/rvm install 2.1.5
     rvm 2.1.5 --default
     sudo chown -R vagrant:vagrant /usr/local/rvm/gems/
     gem install middleman   
     git clone  XXXX
     SHELL
END   

Vagrant 返回给我以下消息:

 /tmp/vagrant-shell: line 10: rvm: command not found

但如果我使用完整路径运行命令,它会返回以下消息:

/usr/local/rvm/bin/rvm 2.1.5 --default

RVM is not a function, selecting rubies with 'rvm use ...' will not work.

You need to change your terminal emulator preferences to allow login shell.
Sometimes it is required to use `/bin/bash --login` as the command.
Please visit https://rvm.io/integration/gnome-terminal/ for an example.

有没有在日志记录模式或其他方式使用 rvm 设置默认版本的方式执行内联脚本?

谢谢:)

最佳答案

对所提供脚本的更改将防止上述代码以错误的退出状态退出。

Vagrant.configure(2) do |config|
  config.vm.box = "ubuntu/trusty64"

  config.vm.provision "shell", inline: <<-SHELL
    RUBY_VERSION="2.1.5"
    sudo apt-get -y update
    sudo apt-get -y install git nodejs
    # Install ruby environment
    if ! type rvm >/dev/null 2>&1; then
      curl -sSL https://rvm.io/mpapis.asc | gpg --import -
      curl -L https://get.rvm.io | bash -s stable
      source /etc/profile.d/rvm.sh
    fi

    if ! rvm list rubies ruby | grep ruby-${RUBY_VERSION}; then
      rvm install ${RUBY_VERSION}
    fi

    rvm --default use ${RUBY_VERSION}
    rvm all do gem install middleman
    git clone <REPLACE_WITH_YOUR_REPO>
SHELL
end

变更说明:

  1. 不需要来源“~/.rvm/scripts/rvm”。首先,它失败了,因为它不存在,因为 vagrant 作为非登录 shell 运行,如前所述。其次,rvm 的安装会在/etc/profile.d/rvm.sh 中创建启动文件,它会为您处理这种情况。参见 https://rvm.io/integration/gnome-terminal .您仍然会在 vagrant 的控制台输出中看到警告(红色),但脚本不会因为错误的退出状态而失败。因此,我们需要在安装 RVM 后立即获取/etc/profile.d/rvm.sh,因为我们当前的 shell 尚未加载 rvm.sh。 RVM 安装输出中提到了这一点。另一种方法是将脚本分成多个部分,以强制尾部脚本选择新路径。
  2. 由于 vagrant 作为非登录 shell 运行,因此无需更改/usr/local/rvm/gems/文件夹的所有权。我认为在某些时候 vagrant 确实以 vagrant 用户的身份运行脚本,但这在最近的版本中已经发生了变化。脚本实际上将以 root 身份运行;这是由于 shell 脚本上的 privileged 选项而默认发生的;见Shell Provisioner .如果您不确定哪个用户正在运行,您可以在脚本中执行 whoami。如果您通过设置 privileged => false 来降低权限,该脚本将作为 vagrant 用户运行。
  3. 添加了一个围绕 rvm GPG key 和安装的条件 block 。除非您需要在每项规定上安装 rvm。有人可能会争辩说,您可能会尝试使其保持最新状态,但这可能会引入未知数并破坏可重复的结果。
  4. 在 ruby​​ 版本的安装周围添加了一个条件 block 。这可以防止有关软件包已安装的警告,请使用重新安装。
  5. 清理了您正在安装的软件包。您可能会重新查看此内容,但您使用 apt-get 安装的软件包将由 rvm 安装程序自动安装,并为您的脚本添加额外的内容。

另一种更灵活的方法

如果您不坚持使用内联脚本。我会按照 Using RVM with Vagrant 中描述的路线走.我将在上面提出的一些建议重新应用于本文中脚本的一般逻辑。 install-rvm.sh 脚本中需要进行的一项更改。添加GPG key 导入;如下所示:

#!/usr/bin/env bash

curl -sSL https://rvm.io/mpapis.asc | gpg --import -
curl -sSL https://get.rvm.io | bash -s $1

关于ruby - VagrantFile 内联脚本和 rvm 配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27961797/

相关文章:

ruby - 如何在 Ruby 中使用 RSpec 模拟 Pusher?

ruby-on-rails - 如何将 t.date 默认为迭代日期?

ruby - 使用模拟时,有什么方法可以避免将许多测试合并到一个示例中吗?

ruby-on-rails-3 - 雪豹上的 RVM Ruby

ruby - 如何将新的 rvm 安装与现有的 ruby​​ 版本相关联?

ruby - 使用适用于 Mac OS X 10.7.5 Leopard、Xcode 4.5.2 的 Ruby 完成 ruby​​ 1.9.3 的安装——rvm pkg install openssl 的问题

python - 盒子里的卡夫卡 : unable to send messages from host

ruby - => 运算符有什么作用?

go - Visual Studio Code 和 vagrant 集成

vagrant - vagrant 会自动安装 puppet 吗?