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

发布时间:2024-04-18
发布人:virskor
查看:88次

我们会使用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。


由于部分文章来自用户发布,或者网络收集,我们无法考证原作者并及时联系。如您认为该文章或内容有侵权,请在发布后与我们取得联系删除。您可以点击网站下方的投诉举报,或者文章内页的举报图标按钮进行举报。我们会及时删除信息。部分用户创作内容可能标记版权信息,如您转载请提前联系并获得书面许可(盖章)。

最近评论

当前评论为精选或存在缓存,点击阅读更多查看最新

empty image

暂无更多数据