【问题标题】:"go get" command not generating the bin folder when it is run in a shell script“go get”命令在 shell 脚本中运行时不生成 bin 文件夹
【发布时间】:2020-09-24 06:57:24
【问题描述】:
我已经安装了 go 包。当我转到实例(VM)并运行命令时
go get github.com/linkedin/Burrow 从终端/cmd 它正在下载用户主目录下的“src”和“bin”文件夹。但是当我通过在 shell 脚本中设置 GOPATH 来运行相同的命令时,它只是下载“src”文件夹而不生成“bin”文件夹。
SOURCE_DIR="/opt/burrow"
export GOPATH=$SOURCE_DIR/go
go get $BURROW_REPO
我错过了什么吗?
【问题讨论】:
标签:
go
installation
package
【解决方案2】:
bin 文件夹或src 文件夹不会由go get 命令自动为您创建。以下是在 go 中创建新项目的标准步骤,假设这是您第一次在 go 中创建项目:
- 在您的工作区目录下,创建一个项目目录,例如“project1”bin、src 目录。
-
设置 GOPATH、GOBIN:
export GOPATH=~/workspace/project1/
export GOBIN=~/workspace/project1/bin
现在如果您只需要源代码,请发送go get github.com/linkedin/Burrow
或者如果您需要二进制文件,请执行 go install github.com/linkedin/Burrow
二进制文件将存储在 ~/workspace/project1/bin 下,源代码存储在 ~/workspace/project1/ 下
如果您通过 make 文件或终端创建项目,则适用相同的步骤
【解决方案3】:
这里发生了很多事情。
你的困惑的第一点是go get 不下载既不是“src”也不是“bin”:Go 包总是只包含源代码,它们通常不包含“ src" 目录在他们的文件和目录层次结构中。
相反,这些目录是 Go 工具链的产物。
第二个混淆点是,从 Go 1.8 开始,Go 工具链使用 fallback value 作为 GOPATH 环境变量(如果未设置),并且在类 Unix 系统上它默认使用名为“go”的目录在执行go 命令的用户的“家”目录下。
如果此目录丢失,工具链将创建它。
因此,我对您的问题的抨击是您有某种权限问题:当 GOPATH 未设置时,使用“$HOME/go”——无论 $HOME 扩展为当前用户的任何值;当您手动设置GOPATH 时,某些东西会阻止在$GOPATH 下创建“bin”目录。
还有另一种可能性:您还设置了GOBIN 环境变量,该变量设置后会覆盖用于安装由go install(和go get)构建的二进制文件的常用位置。
您可以研究go help environment 的输出以了解有关该主题的更多信息。
在任何一种情况下,最明智的前进路径是使用-x 命令行选项运行go install,并查看该命令尝试将生成的可执行映像放在哪里,以及失败的原因(如果有的话)。
您可以研究go help install 和go help build 的输出以了解有关该主题的更多信息。
您也可以考虑针对特定情况强制使用 Go 模块:
对于您的用例,运行 GO111MODULES=on go get github.com/linkedin/Burrow 会快五倍。
一定要先研究go help modules和go help mod-get的输出。