Go 模块命令关系实验
2026/7/10 6:12:45 网站建设 项目流程

这个实验用代码和隔离缓存观察go rungo buildgo getgo mod downloadgo mod tidy分别做了什么。实验在.lab中创建嵌套模块, 不会修改仓库根目录的go.modgo.sum

先记住结论

  1. go rungo build会按需下载模块文件已经完整记录、但本地缓存缺失的依赖。

  2. 源码新增一个第三方import,而go.mod还没有对应模块时,通常要先执行go get 包路径(或者明确使用允许修改模块文件的模式)。

  3. go get的重点是选择依赖版本并修改go.mod;为了完成版本解析,它也会下载。

  4. go mod download的重点是把确定版本的模块放进本地缓存;它不会根据源码判断 哪个import应该新增到go.mod

  5. go mod tidy的重点是让源码、go.modgo.sum对齐。它会加入缺失的必要依赖, 删除不再提供相关包的依赖,并清理校验和。

  6. tidy删除的是模块文件中的依赖记录,不会删除$GOMODCACHE中已经下载的源码。

三种状态对照

1. 源码已经import,但go.mod没有记录

命令

结果

go run/go build

默认报错,提示使用go get添加依赖。

go get 包路径

解析版本、写入go.mod/go.sum,并下载源码。

go mod download

无参数时不会从import猜依赖;即使显式下载模块@版本,也不会因此把它加入go.mod

go mod tidy

扫描源码,添加缺少的必要模块和校验记录,并按需下载。

2. 源码没有import,但go.mod写了模块

命令

结果

go run/go build

不会删除该记录;由于代码不需要其包,通常不下载完整源码,但可能按模块图需要读取元数据。

go get 模块@版本

保留、添加或调整指定版本并下载;go get 模块@none才是显式删除。

go mod download

Go 1.17 及以后,无参数时会下载主模块明确require的模块,即使源码没有直接 import。

go mod tidy

如果它对源码、测试、工具和依赖图确实都不相关,就从go.mod/go.sum删除;缓存源码仍保留。

3. 源码有importgo.mod/go.sum记录完整,但缓存为空

命令

结果

go run/go build

按需自动下载,然后运行或构建。

go get 包路径

下载,并可能按参数重新选择版本;没有版本后缀时可能升级到最新版。

go mod download

下载已确定版本到缓存,不编译、不运行。

go mod tidy

为分析包图而下载,保留必要依赖,并整理直接/间接标记和校验记录。

如果只是手写了go.mod,但还没有对应的go.sum条目,当前 Go 默认可能以missing go.sum entry拒绝run/build。可使用go getgo mod tidygo mod download建立校验记录;显式使用-mod=mod也允许构建命令修正模块文件。

建议,先tidy再run

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询