go模块安装go工具

时间:2018-11-19 04:09:13

标签: go go-modules

我正在使用go模块作为依赖项管理,并且在安装这样的东西时遇到了问题:

go get -u github.com/go-critic/go-critic/...

上面的结果是:

go: cannot find main module; see 'go help modules'

7 个答案:

答案 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 getgo listgo mod download之类的命令的行为就像在具有最初为空的要求的模块中一样。
  在此模式下,go env GOMOD报告系统的空设备(/dev/nullNUL)。

     现在可以安全地同时调用下载和提取模块的

go命令。
  模块缓存(GOPATH/pkg/mod)必须驻留在支持文件锁定的文件系统中。

     

go.mod文件中的go指令现在指示该模块中文件使用的语言版本,如果没有现有版本,go mod tidy会将其设置为当前发行版(版本1.12)礼物。
  如果模块的go指令指定的版本比使用中的工具链更新,则go命令将尝试构建软件包,无论如何,并且仅在构建失败的情况下才会注意不匹配。

答案 2 :(得分:5)

此处的其他几个答案已经过时了。

至少要考虑两种情况:

案例1

您想要安装工具,但不想修改当前的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的工具。

案例2

另一方面,如果您想在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)); ,但这无法解决。

我的解决方案:

  1. 使用go 1.12.5进行升级:https://golang.org/doc/install?download=go1.12.5.linux-amd64.tar.gz

    这可以解决GO111MODULE=on问题。

  2. 然后我遇到另一个问题go: cannot find main module; see 'go help modules'

    可以通过设置环境go: cannot use path@version syntax in GOPATH mode

  3. 来解决

答案 6 :(得分:0)

我遇到了同样的问题,并且“几乎”直接解决了。起初它没有用。这是因为该模块已经初始化,并且在设置GO111MODULE = on之前运行了“ go get ...”命令。

要使其正常运行,我通过运行“ go mod init ...”删除了“ go.mod”,从而重新初始化了mod,然后重新运行了必要的“ go get ....”命令。