Windows路径长度限制(MAX_PATH=260)导致go mod download报错,因模块缓存路径过深;需启用LongPathsEnabled注册表项、缩短GOPATH/GOCACHE路径,并注意CI环境配置。

为什么 go mod download 会报 path too long 错误
Windows 系统对文件路径长度有默认限制(MAX_PATH=260),而 Go 模块路径嵌套较深时(比如 vendor 包 + checksum + 多层模块名),go mod download 生成的缓存路径可能突破该限制,触发 path too long 错误。这不是 Go 本身的设计缺陷,而是 Windows API 层面的约束,尤其在开启 GO111MODULE=on 且使用大量间接依赖时高频出现。
关键点在于:Go 1.13+ 默认把模块缓存放在 %GOPATH%\pkg\mod\cache 下,而模块路径形如 cache\download\github.com\some\org\very\deep\module@v1.2.3\.ziphash\...,层级一多就超限。
启用长路径支持(Windows 10/11 必须做)
这是最基础、最不可跳过的一步。没有它,后续所有配置都无效。
- 以管理员身份运行 PowerShell,执行:
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\FileSystem" -Name "LongPathsEnabled" -Value 1
- 重启终端(CMD/PowerShell/IDE 终端都要重开),否则环境不生效
- 验证是否成功:
Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\FileSystem" | Select-Object LongPathsEnabled 应返回 1
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\FileSystem" -Name "LongPathsEnabled" -Value 1
Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\FileSystem" | Select-Object LongPathsEnabled 应返回 1
注意:仅设置注册表不等于立即可用——很多 IDE(如 VS Code 的 integrated terminal)会继承旧进程环境变量,必须彻底关闭再重开。
缩短 GOPATH 和 GOCACHE 路径
即使启用了长路径支持,过深的初始路径仍可能触发某些工具链 bug(尤其是老版本 Go 或第三方工具调用系统 API 时)。建议主动压平路径层级:
- 将
GOPATH 改为短路径,例如 C:\g,而非 C:\Users\YourName\go
- 显式设置
GOCACHE 到短路径:set GOCACHE=C:\g\cache(Windows CMD)或 $env:GOCACHE="C:\g\cache"(PowerShell)
- 检查当前值:
go env GOPATH GOCACHE,确保输出路径字符数 ≤ 15
GOPATH 改为短路径,例如 C:\g,而非 C:\Users\YourName\go
GOCACHE 到短路径:set GOCACHE=C:\g\cache(Windows CMD)或 $env:GOCACHE="C:\g\cache"(PowerShell)go env GOPATH GOCACHE,确保输出路径字符数 ≤ 15Go 会把模块下载缓存(download 子目录)和构建缓存(build)都放在这两个位置下,缩短它们能直接减少总路径深度。
避免 vendor 目录嵌套过深(go mod vendor 场景)
go mod vendor 会把所有依赖复制到项目根目录下的 vendor 文件夹,若依赖树中存在大量子模块或重命名导入,可能导致 vendor\github.com\...\... 路径爆炸。
- 优先使用
go build -mod=readonly 或 -mod=vendor 而非频繁 go mod vendor
- 如必须 vendor,可在
go.mod 中用 replace 替换深层路径为短别名(例如把 github.com/a/b/c/d/e/f 替换为 short/f),但需同步更新 import 语句
- 检查 vendor 后最大路径长度:
Get-ChildItem -Recurse -File | ForEach-Object { $_.FullName.Length } | Sort-Object -Descending | Select-Object -First 1
go build -mod=readonly 或 -mod=vendor 而非频繁 go mod vendor
go.mod 中用 replace 替换深层路径为短别名(例如把 github.com/a/b/c/d/e/f 替换为 short/f),但需同步更新 import 语句Get-ChildItem -Recurse -File | ForEach-Object { $_.FullName.Length } | Sort-Object -Descending | Select-Object -First 1
真正容易被忽略的是:有些 CI 环境(如 GitHub Actions 的 windows-latest)默认未启用 LongPathsEnabled,即便你本地修好了,CI 仍可能失败——必须在 workflow 中显式添加注册表修改步骤。
立即学习“go语言免费学习笔记(深入)”;


















