shell - 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 环境有关。
有没有人知道可能出了什么问题?
解决方案
推荐阅读
- ios - Flutter - “Safari无法打开页面,因为地址无效”
- javascript - html中超链接模式弹出窗口的onclick
- keystonejs - KeystoneJS 下拉所有列表
- typescript - 如何在 TestCafe RequestMock 中获得原始响应
- python - 用 Tensorflow 数据集拟合 Keras 模型
- amazon-s3 - 使用 SSE-KMS 加密存储桶时创建 s3 访问日志
- google-cloud-platform - GCP Cloud Scheduler 错误,HTTP 目标的状态为 INTERNAL
- php - 使用 laravel pusher 向组中的参与者广播事件
- excel - VBA Selenium with Chrome - 只想在 VBA 中添加错误处理程序
- node.js - 为什么当我的目标服务器端口为 10000 时 devServer 代理返回 400 状态码