我正在使用go模块作为依赖项管理,并且在安装这样的东西时遇到了问题:
go get -u github.com/go-critic/go-critic/...
上面的结果是:
go: cannot find main module; see 'go help modules'
答案 0 :(得分:6)
如果GO111MODULE
变量设置为on
,则即使要获取一个go get
,也必须位于初始化的go模块目录树中才能使用GO111MODULE=off go get <tool>
。 tool ,而不是新的 dependency 。这是一个众所周知且争议很大的问题:
https://github.com/golang/go/issues/27643
https://github.com/golang/go/issues/24250
https://github.com/golang/go/issues/25922
短期内,解决方案是运行go get
。即使您当前在模块包中,这也会显式禁用模块支持,并强制其仅使用您的GOPATH。
长期来看,找出最好的解决方案是通过go install
(或带有标记的go get
之类的其他命令)支持工具安装,这是正在进行的讨论领域
到目前为止,建立共识的方式很少。但是,Go 1.12中有一个PR open,如果被接受,则即使设置了GO111MODULE=on
,也允许glTexSubImage2D
在模块外部简单地工作。
答案 1 :(得分:5)
使用Go 1.12(2019年2月),GO111MODULE=on go get
将起作用。
(摘自issue 24250)
将
现在可以安全地同时调用下载和提取模块的GO111MODULE
设置为on
时,go
命令现在支持模块目录外的模块感知操作,只要这些操作不需要解析相对于当前目录或显式编辑go.mod
文件。
诸如go get
,go list
和go mod download
之类的命令的行为就像在具有最初为空的要求的模块中一样。
在此模式下,go env GOMOD
报告系统的空设备(/dev/null
或NUL
)。
go
命令。
模块缓存(GOPATH/pkg/mod
)必须驻留在支持文件锁定的文件系统中。
go.mod
文件中的go指令现在指示该模块中文件使用的语言版本,如果没有现有版本,go mod tidy
会将其设置为当前发行版(版本1.12)礼物。
如果模块的go指令指定的版本比使用中的工具链更新,则go
命令将尝试构建软件包,无论如何,并且仅在构建失败的情况下才会注意不匹配。
答案 2 :(得分:5)
此处的其他几个答案已经过时了。
至少要考虑两种情况:
您想要安装工具,但不想修改当前的go.mod
来将该工具作为依赖项进行跟踪。
简而言之,对于Go 1.12或1.13,最简单的解决方案是cd
到没有go.mod
的目录,例如:
$ cd /tmp
$ go get github.com/some/tool@v1.0.1
或者,gobin是安装或运行二进制文件的模块感知命令,它提供了更大的灵活性,包括无需更改当前模块的go.mod
请参阅与此相关的answer以获得更多详细信息,包括Go 1.11的解决方案,以及Go 1.14中可能的新选项,以获取无需更新go.mod
的工具。
另一方面,如果您想在go.mod
中将工具作为版本依赖项进行显式跟踪,请参阅模块Wiki上的"How can I track tool dependencies for a module?"常见问题解答。
简而言之,您可以在一个单独的程序包中创建一个tools.go
文件,并设置一个// +build tools
构建标记,例如:
// +build tools
package tools
import (
_ "golang.org/x/tools/cmd/stringer"
)
import语句允许go
命令在模块的go.mod
中精确记录工具的版本信息,而// +build tools
构建约束阻止您的常规构建实际导入工具
答案 3 :(得分:3)
我遇到了同样的问题并通过以下命令解决了它。
$ go env -w GO111MODULE=auto
答案 4 :(得分:1)
尝试此命令
GO111MODULE=on go get -u github.com/go-critic/go-critic/...
答案 5 :(得分:0)
go1.11.2上也有同样的问题。试图设置public SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd");
Calendar calendar = Calendar.getInstance();
calendar.setTime(sdf2.parse("2000-03-21"));
String age=Util.getAge(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DATE));
,但这无法解决。
我的解决方案:
使用go 1.12.5进行升级:https://golang.org/doc/install?download=go1.12.5.linux-amd64.tar.gz
这可以解决GO111MODULE=on
问题。
然后我遇到另一个问题go: cannot find main module; see 'go help modules'
,
可以通过设置环境go: cannot use path@version syntax in GOPATH mode
答案 6 :(得分:0)
我遇到了同样的问题,并且“几乎”直接解决了。起初它没有用。这是因为该模块已经初始化,并且在设置GO111MODULE = on之前运行了“ go get ...”命令。
要使其正常运行,我通过运行“ go mod init ...”删除了“ go.mod”,从而重新初始化了mod,然后重新运行了必要的“ go get ....”命令。