首页 > 解决方案 > 当一个包位于 go/pkg/mod/cache 目录中但没有提取源代码时,这是什么意思?

问题描述

我试图了解第三方依赖项的源代码是如何编译到我的 Go 二进制文件中的。我在 Docker 容器中构建,所以我可以准确地看到为我的构建获取的内容,而不会受到其他构建的干扰。

完成后,我会在目录go build下看到几个依赖项的源代码文件go/pkg/mod/$module@$version模块缓存文档告诉我,这些目录包含“模块 .zip 文件的提取内容。这用作下载模块的模块根目录。” 我最好的猜测是,这些依赖项的提取源代码的存在表明“是的,这些依赖项肯定被编译到你的二进制文件中”。

我还看到更多的依赖项被拉入go/pkg/mod/cache/download/$module目录。模块缓存文档告诉我,这个目录包含“从模块代理下载的文件和从版本控制系统派生的文件”,我不完全理解。据我所知,这些文件不包含任何提取的源代码,尽管.zip我假设有几个文件包含源代码。在大多数情况下,这些文件似乎是.mod只包含表示某种依赖图的文本的文件。

我的问题是:如果第三方依赖项下有模块文件go/pkg/mod/cache/download但没有源代码go/pkg/mod/$module@$version,这是否意味着依赖项的代码没有编译到我的 Go 二进制文件中?

我不明白为什么 Go 构建会引入所有这些模块文件,但只提取了一些第三方模块的源代码。也许 Go 会先发制人地解析和提取从我的第一方代码导入的模块中引用的完整传递模块集的模块信息,但也许其中许多模块最终不需要我的二进制文件的编译 + 构建过程,因此不需要t 被提取。如果这不是真的并且我的问题的答案是否定的,那么我不明白我的二进制文件如何或为什么可以在不go build获取它们的源代码的情况下链接这些依赖项。

标签: go

解决方案


如“编译和安装包和依赖项”中所述

编译的包会自动缓存。

GOPATH和模块包括:

使用模块时,GOPATH 不再用于解析导入。
但是,它仍然用于存储下载的源代码(in GOPATH/pkg/mod)和编译的命令(in GOPATH/bin)。

因此,如果您看到pkg/mod不在其中的来源pkg/mod/cache,请尝试go mod tidy

添加缺失和删除未使用的模块

从那里开始,您应该在源 ( pkg/mod) 和编译模块 ( pkg/mod/cache)之间拥有相同的模块


推荐阅读