有一个(非Go)应用程序正在运行Go可执行文件作为服务器子进程。该子进程本身会调用go
命令进行某些操作。
应用-> Go服务器-> go
可执行文件
所有这些都是在安装了Go 1.11.1的系统上构建的。而且,在该系统上,没有任何问题。但是,在另一台计算机上,它以某种我无法理解的方式失败。事实证明系统已安装Go 1.11.5。
以下是在安装了Go 1.11.5的计算机上运行的Go服务器进程产生的错误:
"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。
如果在产生我的Go服务器进程的环境中执行将GOROOT设置为/usr/local/Cellar/go/1.11.5/libexec
,则在目标计算机上一切正常。
因此,我有一种解决方法,首先使用go env
捕获GOROOT,然后在服务器进程的环境中覆盖GOROOT。
我的理解是,您永远不应设置GOROOT,但似乎GOROOT设置不匹配是一个问题。而且我感到特别沮丧,因为go env
看起来完全像我认为在所有我认为可以测试的情况下都应该在两台计算机上一样。
我仍然怀疑这与为运行服务器子进程而设置的外壳环境有关。
有人知道什么地方可能出问题了吗?