gpt4 book ai didi

ruby - VagrantFile 内联脚本和 rvm 配置

转载 作者:数据小太阳 更新时间:2023-10-29 07:49:45 33 4
gpt4 key购买 nike

我正在尝试使用以下脚本在 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/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com