Go模块下载的临时路径由系统环境变量控制:Unix/macOS用TMPDIR,Windows用TEMP或TMP,该路径独立于GOMODCACHE且无法通过go env配置,仅用于下载解压过程并自动清理。

Go模块下载时的临时路径在哪
Go在拉取远程模块时,不会直接写入pkg/mod缓存目录,而是先下载到一个临时目录解压、校验、重命名,再原子移动过去。这个临时路径默认是系统临时目录(如/tmp或C:\Users\...\AppData\Local\Temp),受TMPDIR(Unix)或TEMP/TMP(Windows)环境变量控制。
如果你遇到磁盘空间不足、权限受限、或需要审计下载行为,就得干预这个临时路径——它不走GOPATH或GOMODCACHE,也不能通过go env -w配置。
- 临时目录仅用于单次下载/解压过程,完成后即清理
- 修改后不影响已缓存的模块,只影响后续
go get、go build触发的新依赖获取 - 多个Go进程可能并发写入同一临时目录,需确保目标路径支持并发创建子目录和文件
用TMPDIR环境变量指定临时路径(Unix/macOS)
Unix系下最直接的方式是设置TMPDIR。注意不是TEMP或TMP,Go只认TMPDIR(见os.TempDir()实现)。
例如把临时文件导向/data/go-tmp:
export TMPDIR=/data/go-tmp go get github.com/sirupsen/logrus
- 路径必须存在且当前用户有读写权限,Go不会自动创建父目录
- 建议使用绝对路径,相对路径行为未定义
- 如果同时运行多个Go命令(如CI中并行构建),该路径会成为所有进程的共享临时区,注意磁盘容量和inode限制
Windows下用TEMP或TMP指定临时路径
Windows平台Go会依次检查TEMP→TMP环境变量(大小写不敏感),任一存在即采用。与Unix不同,TMPDIR在Windows上被忽略。
PowerShell示例:
$env:TEMP="D:\go-tmp" go mod tidy
cmd示例:
set TEMP=D:\go-tmp go build
- 路径末尾不要加反斜杠(
\),否则某些Go版本可能拼接出非法路径 - 若
TEMP和TMP都设置,Go取第一个非空值,顺序不可靠,建议只设一个 - WSL环境下仍需按Linux规则设
TMPDIR,而非Windows的TEMP
为什么GOENV或GOMODCACHE不生效
有人试过go env -w GOMODCACHE=/path或GOENV,发现对下载临时路径完全没影响——这是设计使然。GOMODCACHE只控制最终缓存位置(pkg/mod),而临时目录由底层os.TempDir()提供,完全独立于Go模块系统配置。
-
go env里没有对应字段,无法通过go env -w持久化设置 - 临时路径在
cmd/go/internal/mvs和cmd/go/internal/web等包中硬编码调用os.TempDir(),无hook点 - 想彻底隔离,只能靠环境变量;想细粒度控制(如按模块分临时区),目前无原生支持,需外层封装脚本
真正要改的永远只有那个环境变量,别在Go配置里浪费时间排查。

















