如何在 vagrant provision 期间安装 golang 包?

How to install a golang package during vagrant provision?

关于如何使用 vagrant provision 安装 golang 或如何设置 $GOPATH 环境变量,以便在启动时可用,也有类似的问题。

但是,这个问题是关于如何设置 $GOPATH 等,以便变量在配置脚本的后续步骤(以及其他所有内容)中可用important about golang 就此而言)。我正在使用 ubuntu 图片。

具体来说,我想 运行 my_provision.sh 中的这些步骤:

go get github.com/saymedia/terraform-s3-dir
go install github.com/saymedia/terraform-s3-dir

这样当我 运行 在 vagrant ssh 之后执行以下命令时,它就会正常工作:

terraform-s3-dir

当 go get/install 在 my_provision.sh 中命令 运行 时,它输出以下两种情况之一:沉默,或抱怨 GOPATH var 未设置。无论哪种方式,当我启动时,terraform-s3-dir 不是可识别的命令。

我试过以几种不同的方式设置 GOPATHGOROOTPATH 变量:

直接在 my_provision.sh 中设置它们(有和没有 export),将导出命令回显到 .bashrc 中。将导出命令回显到 /etc/profile.d/gopath.sh。这些都导致“未设置 $GOPATH”。

运行在 my_provision.sh 之前在内联供应脚本中导出。这导致无声失败,除非我尝试使用 sudo 运行 go get/install 命令,在这种情况下它也有 $GOPATH 错误。

如果我在 go get/install 命令之前回显 my_provision.sh 中的 GOPATH 变量,变量显示它们已按预期设置。

如果我 运行 从 vagrant ssh 之后的 shell 手动执行 go get/install 命令,那么它会安装成功。

vagrant ssh 上下文与供应脚本上下文有何不同,其中 go get/install 命令在前者中获得所需的结果,但在后者中没有?

我遇到的问题是,在配置脚本的上下文中,$HOME 指的是 /root/ 文件夹,而不是 /home/ubuntu/

如果您想稍后在配置脚本中使用这些变量,那么在配置期间设置环境变量时不要依赖 $HOME 变量。

这是我的解决方案(来自 VagrantFile

config.vm.provision "shell", inline: <<-SHELL
    echo -n                                          >  /etc/profile.d/gopath.sh
    echo 'export GOROOT=/usr/lib/go'                 >> /etc/profile.d/gopath.sh
    echo 'export GOPATH=/home/ubuntu/go'             >> /etc/profile.d/gopath.sh
    echo 'export PATH=$PATH:$GOROOT/bin:$GOPATH/bin' >> /etc/profile.d/gopath.sh
SHELL
devbox.vm.provision "shell", path: "scripts/my_provision.sh"

此后,GOPATHgo getgo install

正确拾取