在 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'
总结
如果您对发布内容有错误或疑问的话,能够给予评论或提出编辑请求的话,我将非常感激。
感谢您的阅读。