26

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

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

上面的结果是:

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

7 回答 7

17

在这一点上,这里的其他几个答案已经过时了。

至少有两种情况需要考虑:

情况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

有关更多详细信息,请参阅此相关答案,包括 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"
)

import 语句允许go命令在你的模块中精确地记录你的工具的版本信息go.mod,而// +build tools构建约束阻止你的正常构建实际导入你的工具。

于 2019-08-01T22:44:30.793 回答
17

编辑: 这里的原始答案特别提到了 Go 1.11 中工具的状态。自 Go 1.12 发布以来,这不再准确。有关在 Go 1.12 及更高版本中处理此情况的详细信息,请参阅此答案及其链接的答案。

如果GO111MODULEvar 设置为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=onset。

于 2018-11-20T22:12:43.103 回答
6

我遇到了同样的问题并通过以下命令解决了它。

$ go env -w GO111MODULE=auto

于 2021-03-03T04:57:52.807 回答
5

使用Go 1.12(2019 年 2 月),GO111MODULE=on go get将可以使用。
(来自问题 24250

模块

GO111MODULE设置为 时on,该go命令现在支持模块目录之外的模块感知操作,前提是这些操作不需要解析相对于当前目录的导入路径或显式编辑go.mod文件。
诸如 、 和 之类的命令的go get行为go list就像go mod download在具有初始空要求的模块中一样。
在此模式下,go env GOMOD报告系统的空设备(/dev/nullNUL)。

于 2019-01-13T21:40:50.720 回答
0

试试这个命令 GO111MODULE=on go get -u github.com/go-critic/go-critic/...

于 2018-11-19T04:11:46.720 回答
0

刚刚在 go1.11.2 上遇到了同样的问题。尝试设置GO111MODULE=on,但这无法解决。

我的解决方案:

  1. 升级到使用 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'问题。

  2. 然后我又遇到了一个问题go: cannot use path@version syntax in GOPATH mode

    这可以解决设置环境GO111MODULE=on

于 2019-05-28T06:18:47.380 回答
0

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

为了让它工作,我删除了“go.mod”,通过运行“go mod init ...”重新初始化了mod,并重新运行了必要的“go get ....”命令。

于 2020-10-31T15:31:27.487 回答