英文:
go install does not add the binary under GOBIN when running as cloudinit userdata script
问题
我正在尝试安装这个包:github.com/czerwonk/bird_exporter
在安装了golang之后,我这样操作:
GO_VERSION=1.17.1
curl -L https://golang.org/dl/go${GO_VERSION}.linux-amd64.tar.gz -o go${GO_VERSION}.linux-amd64.tar.gz
tar -C /usr/local -xzf go1.17.1.linux-amd64.tar.gz
mkdir /root/go
export GOPATH=/root/go
export PATH=${PATH}:/usr/local/go/bin:${GOPATH}/bin
echo "export GOPATH=${GOPATH}" >> /root/.bashrc
echo "export PATH=${PATH}:/usr/local/go/bin:${GOPATH}/bin" >> /root/.bashrc
我这样安装包:
BIRD_EXPORTER_VERSION=1.2.6
go install github.com/czerwonk/bird_exporter@${BIRD_EXPORTER_VERSION}
当我在EC2实例上手动运行所有这些命令时,最终在默认的GOBIN
位置下安装了该包:
file /root/go/bin/bird_exporter
/root/go/bin/bird_exporter: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), not stripped
但是当相同的命令在userdata脚本中由cloudinit执行时,包会被安装在/root/go/pkg/
下,但是/root/go/bin/
下没有任何内容。
日志显示所有包的下载都正常:
go: downloading github.com/czerwonk/bird_exporter v0.0.0-20210702094413-c9985a3895a4
go: downloading github.com/prometheus/client_golang v1.11.0
go: downloading github.com/sirupsen/logrus v1.6.0
go: downloading github.com/czerwonk/bird_socket v0.0.0-20190111125930-6c39d61f8853
go: downloading github.com/prometheus/client_model v0.2.0
go: downloading github.com/prometheus/common v0.29.0
go: downloading github.com/beorn7/perks v1.0.1
go: downloading github.com/cespare/xxhash/v2 v2.1.1
go: downloading github.com/golang/protobuf v1.4.3
go: downloading github.com/prometheus/procfs v0.6.0
go: downloading golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40
go: downloading github.com/matttproud/golang_protobuf_extensions v1.0.1
go: downloading google.golang.org/protobuf v1.26.0-rc.1
我想了解在这两种情况下go install
的区别,以便我可以正确控制安装该包。
附注:已弃用的go get
也有相同的结果。
英文:
I am trying to install this package: github.com/czerwonk/bird_exporter
After installing golang like so:
GO_VERSION=1.17.1
curl -L https://golang.org/dl/go${GO_VERSION}.linux-amd64.tar.gz -o go${GO_VERSION}.linux-amd64.tar.gz
tar -C /usr/local -xzf go1.17.1.linux-amd64.tar.gz
mkdir /root/go
export GOPATH=/root/go
export PATH=${PATH}:/usr/local/go/bin:${GOPATH}/bin
echo "export GOPATH=${GOPATH}" >> /root/.bashrc
echo "export PATH=${PATH}:/usr/local/go/bin:${GOPATH}/bin" >> /root/.bashrc
I install the package like so:
BIRD_EXPORTER_VERSION=1.2.6
go install github.com/czerwonk/bird_exporter@${BIRD_EXPORTER_VERSION}
When running all these commands on the EC2 instance manually, I end up with the package under the default GOBIN
location:
file /root/go/bin/bird_exporter
/root/go/bin/bird_exporter: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), not stripped
When the same commands get executed by cloudinit in the userdata script, the packages get installed fine under /root/go/pkg/
but there is nothing under /root/go/bin/
.
The logs show the downloading of all packages fine:
go: downloading github.com/czerwonk/bird_exporter v0.0.0-20210702094413-c9985a3895a4
go: downloading github.com/prometheus/client_golang v1.11.0
go: downloading github.com/sirupsen/logrus v1.6.0
go: downloading github.com/czerwonk/bird_socket v0.0.0-20190111125930-6c39d61f8853
go: downloading github.com/prometheus/client_model v0.2.0
go: downloading github.com/prometheus/common v0.29.0
go: downloading github.com/beorn7/perks v1.0.1
go: downloading github.com/cespare/xxhash/v2 v2.1.1
go: downloading github.com/golang/protobuf v1.4.3
go: downloading github.com/prometheus/procfs v0.6.0
go: downloading golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40
go: downloading github.com/matttproud/golang_protobuf_extensions v1.0.1
go: downloading google.golang.org/protobuf v1.26.0-rc.1
I would like to understand what the difference is for go install
in these 2 scenarios so that I can have proper control over installing the package
P.S. go get
, which is deprecated, has the same result.
答案1
得分: 3
这个问题已经解决了。
混淆的原因是日志输出很难读取,但最终我找到了这个:
构建缓存是必需的,但无法找到:未定义GOCACHE,也未定义$XDG_CACHE_HOME和$HOME
当cloudinit运行时,HOME
未设置。显然,Golang需要它来确定GOCACHE
。我希望它在GOPATH
下。
解决方案是同时导出GOCACHE
:
export GOCACHE=/root/go/cache
英文:
This issue has been resolved.
The reason for the confusion was the log output as it was hard to read, but eventually I found this:
build cache is required, but could not be located: GOCACHE is not defined and neither $XDG_CACHE_HOME nor $HOME are defined
HOME
is not set when cloudinit runs. Golang apparently requires it to determine GOCACHE
. I would expect this to be under GOPATH
.
The solution is to also export GOCACHE
:
export GOCACHE=/root/go/cache
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论