GOROOT中不了解go mod和包的原因

Posted

技术标签:

【中文标题】GOROOT中不了解go mod和包的原因【英文标题】:Understanding go mod and cause of package is not in GOROOT 【发布时间】:2022-01-23 09:19:07 【问题描述】:

我正在尝试使用闪电网络。我已经克隆了repo,并将其放在磁盘上(我使用的是 windows):

C:\Users\hallibut\Documents\GitHub\lnd

我想运行 itest 中的任何测试,比如说 testMultiHopPayments。我 cd 进入上述位置后使用的 cli 命令是:

go test itest -run testMultiHopPayments

但是,我不断收到错误消息:

package itest is not in GOROOT (C:\Program Files\Go\src\itest)

我已经阅读了有关此错误的各种帖子,但我仍然不太确定它为什么会发生,这可能是因为我不完全了解 go 模块(我是新手)。这篇文章可能是帮助我理解结构和环境变量的最佳选择:

https://golangbyexample.com/workspace-hello-world-golang/

从各种阅读中我的理解是,无论 go.mod 文件所在的目录是什么目录,都表示模块级目录。在 1.13 版之前,有一个必需的目录和结构,但现在如果您至少使用 1.13 版和模块,这应该不是问题。我正在使用 1.17.1。这在某种程度上是一种假设或推论,但我相信目录结构中较低的所有内容都是作为模块的一部分安装的包的一部分(并且由 package 关键字定义)。但是,我不明白为什么在子目录中包含源代码的包会丢失/抛出上述错误。我也试过跑步:

go mod install github.com/lightningnetwork/lnd/lntest/itest

这似乎没有做任何事情/对错误没有影响。我对包裹有什么不了解的地方?查看 go.mod 文件,我发现 itest 没有在任何地方专门定义……不确定是否需要。另外,我假设我必须事先运行一些构建过程?我尝试过:

go install -v ./...

【问题讨论】:

cd 进入文件夹并执行go test。如果你正确使用模块,就这么简单。 go test -run /^testMultiHopPayments$/不需要模块名,可以用正则表达式过滤掉测试方法运行 所以我相信这有效 - 但我仍然不确定为什么上述方法会引发错误。 【参考方案1】:

如果您使用的是 VS Code 和 Go 模块,则需要“打开文件夹”并指向克隆的 repo,以绕过该错误

【讨论】:

如果我只是从命令行运行呢? 在这种情况下,接下来要尝试检查您的环境,您能否检查 GOPATH、GO111MODULE、GOPROXY 的 env 值?我相信他们的价值观在你的情况下应该是“”、“开”、“直接” 对于 gopath,对于模块,现在在 gopath 之外编写包是很常见的,因此它实际上已被弃用。这就是为什么它未设置/设置为 null

以上是关于GOROOT中不了解go mod和包的原因的主要内容,如果未能解决你的问题,请参考以下文章

GO MOD

GO MOD

Go基础:路径文件名和包名的关系

Go go.mod入门

Go go.mod入门

go语言web框架beego安装(go mod方式)