如何在 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
不是可识别的命令。
我试过以几种不同的方式设置 GOPATH
、GOROOT
和 PATH
变量:
直接在 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"
此后,GOPATH
被 go get
和 go install
正确拾取
关于如何使用 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
不是可识别的命令。
我试过以几种不同的方式设置 GOPATH
、GOROOT
和 PATH
变量:
直接在 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"
此后,GOPATH
被 go get
和 go install