golang中的模块缓存在哪里?

46
当我启用了Go模块并构建我的Go程序后,所需的软件包会被下载。但是我无法在$GOPATH/src/或$GOPATH/src/mod中找到它们。它们被存储在哪里?
当我启用Go模块并构建我的Go程序后,所需的软件包会被下载。但是我无法在$GOPATH/src/或$GOPATH/src/mod中找到它们。它们被存储在哪里?
export GO111MODULE=on
go mod init
go build main.go 
go: finding github.com/sirupsen/logrus v1.0.6
go: downloading github.com/sirupsen/logrus v1.0.6
...
6个回答

60

对于 Go 1.11,它们存储在

$GOPATH/pkg/mod

9
请注意,此内容已记录在go help modules中。 - Martin Tournoij
15
在Linux上,如果$GOPATH为空,则模块将存储在/home/<user>/go/pkg/mod中! - ifnotak
1
@ifnotak 与 macOS 相同。 - Allen
当启用Go模块时,GOPATH就没有意义了。请参见https://dev59.com/AVQK5IYBdhLWcg3wQt9t#67233153获取当前答案。 - deubeulyou

9
为了确定缓存位置,您可以使用go env命令:
go env|grep CACHE

为清除缓存,使用go clean -modcachego clean -cache命令,具体要看需要清除哪种类型的缓存。

谢谢。go help clean 还列出了其他一些选项。 - PJ Brunet

8
在终端中运行此命令。
go env GOMODCACHE

go env - 打印所有 Go 环境信息。

go env NAME - 打印指定的环境变量。


1
你应该在回答中包含更多的解释。你提供的答案几乎与Chris于2020年12月30日发布的答案完全相同。你的答案应该改进现有的答案。 - Hermes
我认为这个答案更适用于最近版本的Go,并且它对Chris的答案进行了改进。 - deubeulyou

7
模块缓存存储在$GOPATH/pkg/mod,如果未设置$GOPATH,则存储在$HOME/go/pkg/mod中。
注意:通常,模块缓存是只读的,旨在成为一个不可变的缓存。因此,您不应尝试在其中编辑任何内容,也不应在缓存内运行go命令。
模块缓存包含zip文件、解压后的模块源代码以及VCS缓存(当不使用代理时)。缓存通常包含单个依赖项的多个版本。
如果您想要检查模块缓存中依赖项的代码,一个快捷方式是通过以下命令直接进入解压后依赖项的位置:cd
cd $(go list -f '{{.Dir}}' -m github.com/foo/bar)

这会让 go list 报告模块缓存中模块 github.com/foo/bar 的目录位置,默认为当前模块中使用的版本。

由于缓存旨在是不可变的,因此一个相关的问题是如何编辑依赖项(例如,如果您想添加调试日志,或者为依赖项准备发送上游修复)。此时的常见解决方案是使用 gohack 创建依赖项的可变副本(默认情况下位于 $HOME/gohack,但位置受 $GOHACK 变量控制)。gohack 还将您当前的 go.mod 文件设置为具有指向该可变副本的 replace 指令。


7
我正在使用Macos 10.13.6,使用go1.11 darwin/amd64echo $GOPATH为空。
我发现我的模块在$HOME/go/pkg/mod中。

你是否将 $GOPATH 设置为 $HOME/go? - Oskar Szura
6
在 Go 1.11 及其以上版本中,$GOPATH 的默认值为 $HOME/go。 - joeblubaugh

4

如果您想清除缓存,则可以使用命令go clean --modcache

如果您只需要更新某些依赖项,您可能希望从以下位置清除有关此依赖项的信息:

  • go.mod
  • go.sum
  • vendor/modules.txt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接