首页 > 解决方案 > go executable 以某种方式确定了错误的 GOROOT

问题描述

有一个(非 Go)应用程序将 Go 可执行文件作为服务器子进程运行。该子进程本身为某些操作调用go命令。

应用程序 -> Go 服务器 ->go可执行文件

所有这些都建立在安装了 Go 1.11.1 的系统上。而且,在那个系统上,没有问题。但是,在另一台机器上,它以我无法理解的方式失败。事实证明,系统安装了 Go 1.11.5。

这是 Go 服务器进程产生的错误,在安装了 Go 1.11.5 的机器上运行:

"couldn\'t exec \'go [list -e -json -compiled -test=true -export=false -deps=true -find=false -- 
/usr/local/Cellar/go/1.11.1/libexec/src/builtin]\': chdir 
/usr/local/Cellar/go/1.11.1/libexec/src/builtin: no such file or directory *os.PathError"

我已经确定该字符串/usr/local/Cellar/go/1.11.1/libexec实际上嵌入在 Go 服务器可执行文件中。我曾经strings这样做过。

GOROOT 在任何一台机器上都没有被覆盖。

在我的机器上,go env GOROOT报告:

/usr/local/Cellar/go/1.11.1/libexec

在目标机器上,go env GOROOT报告:

/usr/local/Cellar/go/1.11.5/libexec

作为测试,我使用完全相同的环境设置go env在我的主机应用程序中运行,而不是启动服务器进程。/usr/local/Cellar/go/1.11.5/libexec这也会在目标机器上产生一个 GOROOT 。

如果我确实将 GOROOT 覆盖/usr/local/Cellar/go/1.11.5/libexec在产生我的 Go 服务器进程的环境中,那么目标机器上的事情就会正常工作。

所以,我有一个解决方法,首先用 捕获 GOROOT go env,然后在服务器进程的环境中覆盖 GOROOT。

我的理解是你永远不应该设置 GOROOT,但似乎 GOROOT 设置不匹配是问题所在。而且我特别难过,因为go env在我认为可以测试的所有情况下,它看起来都与我认为的两台机器上的完全一样。

我仍然怀疑这与为运行服务器子进程而设置的 shell 环境有关。

有没有人知道可能出了什么问题?

标签: shellgo

解决方案


推荐阅读