温馨提示  2024年 6月我们已经停止内容更新,当前提供存档数据流量服务,谢谢来访。
知识 2024-04-18 175 次阅读

使用go install后仍无法使用全局命令的原因

我们会使用go install 安装一些go实现的二进制应用。但有的时候虽然执行了,在运行bash或zshell的时候找不到命令。这样的问题确实会困扰我们,排查这个问题需要检查GoENV的配置,也就是环境变量。使用 go install 命令安装一个 Go 模块后,该模块生成的可执行文件会被安装到指定的目录中,如果目录配置不正确,自然就无法运行。

首先检查环境变量配置问题:请确保将 $GOPATH/bin 或者 $GOBIN 加入到您的系统环境变量 PATH 中。这样操作系统才能找到并执行当前路径中的可执行文件。

安装目录不在预期位置:检查利用 go env GOBIN 命令来确定生成的可执行文件实际上是否已被安装到了预期的位置(默认为 $GOPATH/bin 或者 $GOBIN),并且确保您有访问此目录(以防权限问题)。

如果都没有办法执行,确保你安装的代码是正常的。要确保您的 Go 模块已成功编译和安装,首先检查是否生成二进制文件,并且模块中包含了可执行文件(main 包)。如有必要,可以在 go install 命令后添加额外的参数或选项以获得更多的输出和调试信息。


用法详解:

用法: go install [构建标志] [包名]

install 编译并安装由导入路径指定的包。

可执行文件会被安装到由环境变量 GOBIN 指定的目录中,如果未设置 GOPATH 环境变量,则默认为 GOPATH/bin或者 HOME/go/bin。

会被安装到 GOROOT中的可执行文件会被安装到 GOROOT/bin 或者 GOTOOLDIR,而不是 GOBIN。

如果参数具有版本后缀(比如 @latest 或者 @v1.0.0),"go install" 以模块感知模式进行构建,忽略当前目录或其父目录中的 go.mod 文件。这对于

安装可执行文件而不影响主模块的依赖非常有用。

为了消除在构建过程中使用哪个模块版本的歧义,参数必须满足以下约束条件:

  • 参数必须是包路径或包模式(带有 "..." 通配符)。不能是标准包(如 fmt)、元模式(std、cmd、all)或相对/绝对文件路径。
  • 所有参数必须具有相同的版本后缀。即使引用相同版本,也不允许不同查询。
  • 所有参数必须引用同一个模块内部的相同版本的包。
  • 包路径参数必须引用 main 包。只有匹配 main 包的模式参数才能匹配。
  • 没有模块被视为 "main" 模块。如果命令行上的包所在的模块包含 go.mod 文件,则该文件不能包含导致其与主模块解释方式不同的指示(replace 和 exclude)。模块本身也不能要求更高版本。
  • 任何模块中都不使用供应商目录。(供应商目录不会被 'go install' 下载的模块压缩文件中包括)

如果参数没有版本后缀,"go install" 可以在启用了模块感知模式或 GOPATH 模式下运行,具体取决于 GO111MODULE 环境变量和是否存在 go.mod 文件。详情请参考 'go help modules'。

如果启用了模块感知模式,"go install" 将在主模块的上下文中运行。

当禁用了模块感知模式时,非 main 包将安装在 GOPATH/pkg/ GOOS_

Go 1.20 之前,标准库默认安装到

GOARCH目录中。当启用了模块感知模式时,非main包将被构建和缓存但不会安装。Go1.20之前,标准库默认安装到 GOROOT/pkg/ GOOS_ GOARCH。

从 Go 1.20 开始,默认情况下标准库会被构建和缓存但不安装。

设置 GODEBUG=installgoroot=all 可以恢复使用

GOROOT/pkg/ GOOS_$GOARCH。

有关构建标志的更多信息,请参阅 'go help build'。

有关指定包的更多信息,请参阅 'go help packages'。

另请参阅:go build,go get,go clean。