在 Golang 1.11 的情况下,当 GO111MODULE=on 时无法全局 go get 的解决方法

当试图使用go get命令获取Golang制作的工具时,

go: cannot find main module; see 'go help modules'

出力了一个错误,让我感到困惑不解。
尽管我搜索了一下,但没有找到明确的解决方法。幸运的是,Golang的维基页面上总结了一些解决方案。

结论

以下是我们采用的步骤,虽然Golang的文档中提供了几种处理方法。

创建一个用于Go工具的目录

我把它创建在我的主目录了,但原则上在任何地方都可以。

mkdir go-tools
cd go-tools

模块的初始设置

通过下面的命令将创建Go Modules文件。

go mod init go-tools

去执行go get

如果你想安装go-langserver,可以按照以下方式操作。使用-u选项是可选的,取决于你的个人喜好。

go get -u github.com/sourcegraph/go-langserver

这样就可以将Go工具添加到$GOPATH/bin,并在全局范围内使用。

补充

引起错误发生的原因

如果在Go 1.11版本中设置了GO111MODULE=on,那么只有在存在go.mod文件的目录中才能执行go get。
据说,从Go 1.12版本开始,GO111MODULE=on将成为标准行为,所以将来可能会采用类似上述方法或使用其他工具进行管理。

前情信息已经证明,从Golang 1.12开始,即使没有go.mod文件也可以执行go get命令。因此,我认为本次介绍的步骤已经变得不再必要。

其他的应对方法 (jì tā de duì fǎ)

在Golang的Wiki的Modules页面中,还介绍了一些全局安装工具的方法,这里将介绍其中的一部分。
如果您想了解其他方法或者更详细的信息,请参阅Wiki页面。

停用GO111MODULE=on。

如果在GO111MODULE=on的情况下,无法在Modules规范下进行全局执行go get的话,那就可以考虑放弃它。
从环境变量中移除GO111MODULE=on,或者设置为GO111MODULE=auto都是不错的选择。

只需要一种选择,将以下内容以中文为母语进行改写:

只在执行时将GO111MODULE=on忽略掉。

如果想要为Go 1.12及更高版本做好准备并且希望长期保留GO111MODULE=on,那么还有一个选择,就是只在执行时去除Modules。

GO111MODULE=off go get example.com/cmd

也有一种方法是设置别名。

alias oldget='GO111MODULE=off go get'

总结

如果您对发布内容有错误或疑问的话,能够给予评论或提出编辑请求的话,我将非常感激。
感谢您的阅读。

广告
将在 10 秒后关闭
bannerAds