go模块安装go工具
我使用go模块作为依赖项管理,但在安装类似以下内容时遇到问题:go模块安装go工具,go,go-modules,Go,Go Modules,我使用go模块作为依赖项管理,但在安装类似以下内容时遇到问题: go get -u github.com/go-critic/go-critic/... 上述结果是: go: cannot find main module; see 'go help modules' 试试这个命令 GO111MODULE=on go-get-u github.com/go-critic/go-critic/…编辑:此处的原始答案特别提到了go 1.11中的工具状态。自从Go 1.12发布以来,这已不再准确。
go get -u github.com/go-critic/go-critic/...
上述结果是:
go: cannot find main module; see 'go help modules'
试试这个命令
GO111MODULE=on go-get-u github.com/go-critic/go-critic/…
编辑:此处的原始答案特别提到了go 1.11中的工具状态。自从Go 1.12发布以来,这已不再准确。有关在Go 1.12及更高版本中处理这种情况的详细信息,请参阅及其链接
如果GO111MODULE
变量在上设置为,则您必须在初始化的go模块目录树中才能使用go get
,即使您试图获取工具而不是新的依赖项。这是一个众所周知且备受争议的问题:
短期解决方案是运行GO111MODULE=off-go-get
。这将显式禁用模块支持,即使您当前在模块包中,并强制它仅使用您的GOPATH
从长远来看,通过go-get
(或另一个命令,如带有标志的go-install
)来支持工具安装是一个持续讨论的领域
到目前为止,几乎没有达成共识。然而,如果接受for Go 1.12,它将允许Go get
在模块外工作,即使设置了GO111MODULE=on
。2019年2月,GO111MODULE=on Go get
也可以工作。
(来自)
模块
当GO111MODULE
设置为on
时,go
命令现在支持模块目录外的模块感知操作,前提是这些操作不需要解析相对于当前目录的导入路径或显式编辑go.mod
文件。
诸如go-get
、go-list
和go-mod-download
等命令的行为就像是在一个最初要求为空的模块中一样。
在此模式下,go env GOMOD
报告系统的空设备(/dev/null
或NUL
)
刚在go1.11.2上出现了同样的问题。试图设置GO111MODULE=on
,但无法修复
我的解决方案:
升级至使用go 1.12.5:
这可以解决go:找不到主模块;请参阅“转到帮助模块”
问题
然后我遇到了另一个问题go:无法使用path@versionGOPATH模式下的语法
通过设置envGO111MODULE=on
这里的其他几个答案在这一点上已经过时了
至少有两种情况需要考虑:
案例1
您想安装一个工具,但不想修改当前的go.mod
以作为依赖项跟踪该工具
简而言之,对于Go 1.12或1.13,最简单的解决方案是将cd
放入没有Go.mod
的目录,例如:
$ cd /tmp
$ go get github.com/some/tool@v1.0.1
// +build tools
package tools
import (
_ "golang.org/x/tools/cmd/stringer"
)
或者,是一个模块感知命令,用于安装或运行二进制文件,提供了额外的灵活性,包括在不改变当前模块的go.mod
有关更多详细信息,请参阅此相关文档,包括Go 1.11的解决方案,以及Go 1.14中可能的新选项,用于在不更新您的Go.mod
的情况下获取工具
案例2
另一方面,如果您想在go.mod
中明确跟踪作为版本依赖项的工具,请参阅模块wiki上的常见问题解答
简而言之,您可以在一个单独的包中创建一个tools.go
文件,并设置一个/+buildtools
build标记,例如:
$ cd /tmp
$ go get github.com/some/tool@v1.0.1
// +build tools
package tools
import (
_ "golang.org/x/tools/cmd/stringer"
)
import语句允许go
命令在模块的go.mod
中精确记录工具的版本信息,而/+build tools
build约束阻止正常构建实际导入工具。我也遇到了同样的问题,并且直接“几乎”解决了这个问题。起初它不起作用。这是因为模块已经初始化,在设置GO111MODULE=on之前,我已经运行了“go get…”命令
为了让它工作,我删除了“go.mod”,通过运行“go mod init…”重新初始化mod,并重新运行必要的“go get…”命令。我遇到了同样的问题,并通过下面的命令解决了它
$go env-w GO111MODULE=auto是否初始化了主模块“go mod init”?为了更好地理解,请转到这个问题。对于错误的描述,很抱歉,我的问题是将cli工具安装到我的$GOPATH/bin目录中。请参阅此相关内容,其中包括Go 1.11的选项、Go 1.12中添加的相关功能,以及Go 1.14中有望支持的功能。此魔术不起作用。我已经导出GO111MODULE=on。我想要的是在GO111MODULE=on的情况下将cli工具安装到$GOPATH/bin目录中。它使go-get工具在打开Go111模块后表现不同。=>GO111MODULE=on或GO111MODULE=autoFWIW,此答案是正确的,但不再正确。请参阅此以了解更多详细信息和Go 1.12、1.13的答案,以及Go 1.14中可能的新选项,以便在不更新Go.mod的情况下获得工具。此外,这个答案还涵盖了如果您想在go.mod中将工具作为版本依赖项显式跟踪该怎么做(例如,可能是因为您希望每个人都使用完全相同版本的linter或代码生成器,以避免由于不同的人使用的工具版本略有不同而出现抖动)。与我自己的相比,这是一个有趣的更新(最终陈腐)回答。赞成票。我刚刚花了一天时间试图解决工具造成的所有问题。go
hack。我建议人们不要使用它。参见案例2,如果我在一个新克隆的项目上运行go mod download
,该项目有工具。go
文件,那么我是否需要为每个t手动运行go install
列出的ool