我使用 go 模块作为依赖管理,我在安装这样的东西时遇到了问题:
go get -u github.com/go-critic/go-critic/...
上面的结果是:
go: cannot find main module; see 'go help modules'
我使用 go 模块作为依赖管理,我在安装这样的东西时遇到了问题:
go get -u github.com/go-critic/go-critic/...
上面的结果是:
go: cannot find main module; see 'go help modules'
在这一点上,这里的其他几个答案已经过时了。
至少有两种情况需要考虑:
您想要安装一个工具,但您不想修改您的当前go.mod
以将该工具作为依赖项进行跟踪。
简而言之,对于 Go 1.12 或 1.13,最简单的解决方案是转到cd
没有 的目录go.mod
,例如:
$ cd /tmp
$ go get github.com/some/tool@v1.0.1
或者,gobin是一个模块感知命令,用于安装或运行二进制文件,提供额外的灵活性,包括在不改变当前模块的情况下进行安装的能力go.mod
有关更多详细信息,请参阅此相关答案,包括 Go 1.11 的解决方案,以及 Go 1.14 中可能的新选项,用于在不更新您的go.mod
.
另一方面,如果您想在您go.mod
的. 模块 wiki 上的常见问题解答。
简而言之,你tools.go
在一个单独的包中创建一个文件,并设置一个// +build tools
构建标签,例如:
// +build tools
package tools
import (
_ "golang.org/x/tools/cmd/stringer"
)
import 语句允许go
命令在你的模块中精确地记录你的工具的版本信息go.mod
,而// +build tools
构建约束阻止你的正常构建实际导入你的工具。
编辑: 这里的原始答案特别提到了 Go 1.11 中工具的状态。自 Go 1.12 发布以来,这不再准确。有关在 Go 1.12 及更高版本中处理此情况的详细信息,请参阅此答案及其链接的答案。
如果GO111MODULE
var 设置为on
,则您必须位于初始化的 go 模块目录树中才能使用go get
,即使您尝试获取工具而不是新依赖项也是如此。这是一个已知且备受争议的问题:
https://github.com/golang/go/issues/27643
https://github.com/golang/go/issues/24250
https://github.com/golang/go/issues/25922
短期的解决方案是运行GO111MODULE=off go get <tool>
. 即使您当前在模块包中,这也会显式禁用模块支持,并强制它仅使用您的 GOPATH。
从长远来看,找出最好的解决方案是通过go get
(或其他命令,如go install
使用标志)来支持工具安装是一个正在进行的讨论领域,迄今为止几乎没有达成共识。但是,Go 1.12 有一个PR 开放,如果被接受,将允许go get
在模块外简单地工作,即使使用GO111MODULE=on
set。
我遇到了同样的问题并通过以下命令解决了它。
$ go env -w GO111MODULE=auto
试试这个命令
GO111MODULE=on go get -u github.com/go-critic/go-critic/...
刚刚在 go1.11.2 上遇到了同样的问题。尝试设置GO111MODULE=on
,但这无法解决。
我的解决方案:
升级到使用 go 1.12.5:https ://golang.org/doc/install?download=go1.12.5.linux-amd64.tar.gz
这可以解决go: cannot find main module; see 'go help modules'
问题。
然后我又遇到了一个问题go: cannot use path@version syntax in GOPATH mode
,
这可以解决设置环境GO111MODULE=on
我有同样的问题,它“几乎”直接解决了。起初它没有用。这是因为模块已经初始化并且我在设置 GO111MODULE=on 之前运行了“go get...”命令。
为了让它工作,我删除了“go.mod”,通过运行“go mod init ...”重新初始化了mod,并重新运行了必要的“go get ....”命令。