模块缓存
模块缓存是 go
命令存储下载模块文件的目录。 模块缓存与构建缓存不同,其中包含了编译包和其他构建构件。
默认模块位置是 $GOPATH/pkg/mod
. 若要改变位置,设置 GOMODCACHE
environment variable.
模块缓存没有最大大小限制,并且 go
命令不会自动删除其内容。
在同一台计算机上开发的多个 Go 项目可以共享缓存。不管主模块在哪里,go
命令都会使用相同的缓存。 go
命令的多个实例可以同时安全地访问相同的模块缓存。
go
命令在缓存中创建具有只读权限的模块资源文件和目录,以防止模块下载后发生意外更改。这会导致一个副作用就是造成 rm -rf
命令删除都很困难。 但是可以使用 go clean -modcache
命令删除。 或者,当使用 -modcacherw
标志时,go
命令将创建具有读写权限的新目录。这增加了编辑器、测试和其他程序修改模块缓存中的文件的风险。 go mod verify
命令可用于检测对主模块依赖项的修改。它扫描每个模块依赖项的提取内容,并确认它们匹配 go.sum
中的预期哈希值。
下表介绍了在模块缓存中大多数文件的用途。一些暂时性的文件(如锁文件,临时目录)被省略了。对于每个路径,$module
是一个模块路径,$version
是一个版本。以斜线(/
)结尾的路径是目录。模块路径和版本中的大写字母用感叹号转义(如 Azure
会被转义为 !!azure
)以避免在不区分大小写的文件系统中发生冲突。
路径 | 用途 |
---|---|
$module@$version/ |
包含提取的模块.zip 文件内容的目录。这个目录是下载的模块的根目录。如果原始模块没有 go.mod 文件,它就不包含 go.mod 文件。 |
cache/download/ |
包含从模块代理下载的文件和来自版本控制系统的文件的目录。这个目录的布局遵循 GOPROXY 协议,所以当由 HTTP 文件服务器提供服务或用 file:// URL 引用时,这个目录可以作为一个代理使用。 |
cache/download/$module/@v/list |
已知版本列表。(见 GOPROXY 协议). 这可能会随着时间的推移而改变,所以 go 命令通常会获取一个新的副本而不是重新使用这个文件。 |
cache/download/$module/@v/$version.info |
关于版本的 JSON 元数据。(见 GOPROXY 协议)。这可能会随着时间的推移而改变,所以 go 命令通常会获取一个新的副本而不是重新使用这个文件。 |
cache/download/$module/@v/$version.mod |
当前版本的 go.mod 文件(见 GOPROXY 协议)。如果原始模块没有 go.mod 文件,这就是一个没有要求的合成文件。 |
cache/download/$module/@v/$version.zip |
模块的压缩内容(见 GOPROXY 协议 和模块压缩文件)。 |
cache/download/$module/@v/$version.ziphash |
在.zip 文件中的文件加密哈希值。注意,.zip 文件本身没有被散列,所以文件的顺序、压缩、排列和元数据都不会影响散列值。当使用一个模块时,go 命令会验证这个哈希值是否与 go.sum 中的相应行一致。go mod verify 命令会检查模块.zip 文件和提取目录的哈希值是否与这些文件相符。 |
cache/download/sumdb/ |
包含从 checksum 数据库下载的文件的目录 (通常是 sum.golang.org )。 |
cache/vcs/ |
包含直接从源头获取的模块的克隆的版本控制库。目录名称是由版本库类型和 URL 得出的十六进制编码的哈希值。仓库在磁盘上的大小是经过优化的。例如,在可能的情况下,克隆的 Git 仓库是裸露的和浅层的。 |
本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
推荐文章: