英文:
How to install a golang package during vagrant provision?
问题
有类似的问题关于如何使用vagrant provision安装golang或如何设置$GOPATH
环境变量,以便在启动时可用。
然而,这个问题是关于如何设置$GOPATH
等,以便在后续的provisioning脚本步骤中该变量是可用的(以及关于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
当my_provision.sh
中的go get/install命令运行时,它会输出以下两种结果之一:静默或者投诉GOPATH
变量未设置。无论哪种情况,当我启动后,terraform-s3-dir
都不是一个被识别的命令。
我尝试了几种不同的方式来设置GOPATH
、GOROOT
和PATH
变量:
直接在my_provision.sh
中设置它们(带或不带export
),将export命令输出到.bashrc文件中,将export命令输出到/etc/profile.d/gopath.sh文件中。所有这些都导致"$GOPATH未设置"的错误。
在inline provisioning脚本中运行export命令,在运行my_provision.sh
之前。这导致静默失败,除非我尝试使用sudo运行go get/install命令,此时也会出现$GOPATH
错误。
如果我在my_provision.sh
中的go get/install命令之前立即输出GOPATH变量,变量显示它们按预期设置。
如果我在vagrant ssh
之后手动从shell运行go get/install命令,那么它会成功安装。
vagrant ssh
上下文与provisioning脚本上下文有何不同,导致go get/install命令在前者中获得期望的结果,而在后者中没有呢?
英文:
There are similar questions about how to install golang with vagrant provision or how to set $GOPATH
environment variable, such that it will be available on boot.
However, this question is about how you can set $GOPATH
, etc, such that the variable is available during later steps of the provisioning script (and everything else important about golang is in-place for that matter). I'm using an ubuntu image.
Specifically, I want to run these steps in my_provision.sh
:
go get github.com/saymedia/terraform-s3-dir
go install github.com/saymedia/terraform-s3-dir
such that when I run the following command after vagrant ssh
, it will just work:
terraform-s3-dir
When the go get/install commands run in my_provision.sh
, it outputs one of two things: silence, or complaints that the GOPATH
var is not set. Either way, when I boot in, terraform-s3-dir
is not a recognised command.
I've tried setting the GOPATH
, GOROOT
and PATH
variables in several different ways:
Setting them in my_provision.sh
directly (with and without export
), echoing export commands into .bashrc. echoing exporting commands to /etc/profile.d/gopath.sh. These all results in "$GOPATH not set".
running exports in an inline provisioning script, prior to my_provision.sh
. This resulted in silent failure, unless I try to run the go get/install commands with sudo, in which case it has the $GOPATH
error, too.
If I echo the GOPATH variable in my_provision.sh
immediately before the go get/install commands, the variables show that they are set as expected.
If I run the go get/install commands manually from the shell after vagrant ssh
, then it installs successfully.
What is different about the vagrant ssh
context, vs the provisioning script context, where the go get/install commands get the desired result in the former, but not the latter?
答案1
得分: 0
我遇到的问题是,在配置脚本的上下文中,$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"
在这之后,go get
和 go install
正确地使用了这个 GOPATH
变量。
英文:
The problem I was having is that in the context of the provisioning script, $HOME
refers to the /root/
folder, rather than /home/ubuntu/
It pays to NOT rely on the $HOME
variable when setting environment variables during provisioning, if you want to use those variables later in the provisioning scripts.
Here is my solution (from 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"
After this, this GOPATH
is picked up correctly by go get
and go install
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论