我正在使用go模块作为依赖关系管理,我在安装以下内容时遇到了问题:
go get -u github.com/go-critic/go-critic/...
上述结果如下:
go: cannot find main module; see 'go help modules'
发布于 2018-11-20 22:12:43
编辑:这里的原始答案特别提到了Go 1.11中的工具状态。自从Go 1.12发布以来,这已经不再准确了。有关Go 1.12及更高版本中处理此情况的详细信息,请参阅https://stackoverflow.com/a/57317864/11210494及其链接。
如果GO111MODULE
变量设置为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
设置下也是如此。
发布于 2019-08-01 22:44:30
这里的其他几个答案在这一点上已经过时了。
至少有两个案件需要考虑:
案例1
您希望安装一个工具,但不希望修改当前的go.mod
来将该工具作为依赖项进行跟踪。
简而言之,对于Go 1.12或1.13,最简单的解决方案是对没有cd
的目录进行go.mod
,例如:
$ cd /tmp
$ go get github.com/some/tool@v1.0.1
或者,戈宾是一个安装或运行二进制文件的模块感知命令,它提供了额外的灵活性,包括在不改变当前模块的go.mod
的情况下安装的能力。
有关更多细节,请参见此相关的回答,包括Go 1.11的解决方案,以及Go 1.14中可能的新选项,用于在不更新go.mod
的情况下获得工具。
案例2
另一方面,如果您想在go.mod
中显式地将一个工具跟踪为一个版本化的依赖项,那么可以在模块wiki上看到“如何跟踪模块的工具依赖关系?”常见问题。
简而言之,您可以在一个单独的包中创建一个tools.go
文件,并设置一个// +build tools
构建标记,例如:
// +build tools
package tools
import (
_ "golang.org/x/tools/cmd/stringer"
)
导入语句允许go
命令在模块的go.mod
中精确记录工具的版本信息,而// +build tools
构建约束则阻止正常构建实际导入工具。
发布于 2021-03-03 04:57:52
我也面临着同样的问题,并通过以下命令解决了这个问题。
$ go env -w GO111MODULE=auto
https://stackoverflow.com/questions/53368187
复制相似问题