Windows上Go程序报“no such file or directory”大概率是路径超260字符被系统截断,须同时启用注册表LongPathsEnabled、构建时嵌入longPathAware manifest、并缩短物理路径(如GOPATH和项目根目录),缺一不可。

Windows 上 go build 失败或 os.Open 报 no such file or directory,大概率不是路径写错了,而是路径长度被系统截断——Go 本身能处理长路径,但 Windows 默认拦在门外。必须同时改系统配置、构建方式和项目结构,缺一不可。
Windows 系统级长路径开关必须打开
仅靠 Go 代码或 go build 参数无法绕过这个限制。注册表项 Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem\LongPathsEnabled 必须设为 1(DWORD)。Server 版 Windows 默认关闭,旧版 Win10(1607 前)甚至不支持该选项。
- 管理员权限运行 PowerShell 执行:
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\FileSystem" -Name "LongPathsEnabled" -Value 1 - 修改后需重启资源管理器或整个系统,
cmd /c echo %__CD__%超过 260 字符能正常输出才算生效 - CI 环境(如 GitHub Actions 的 windows-latest)默认已开启,但自建 Windows Agent 需手动确认
Go 构建必须嵌入 longPathAware manifest
Go 1.16+ 默认使用 \?\ 前缀调用 Win32 API,但前提是可执行文件的 manifest 明确声明支持长路径。Go build 不自动嵌入 manifest,必须手动指定。
- 新建
app.manifest文件,内容严格为:<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3"> <security> <requestedPrivileges> <requestedExecutionLevel level="asInvoker" uiAccess="false"/> </requestedPrivileges> </security> </trustInfo> <windowsSettings xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings"> <longPathAware>true</longPathAware> </windowsSettings> </assembly> - 构建时加参数:
go build -ldflags "-manifest app.manifest"(控制台程序去掉-H windowsgui) - 验证是否生效:
sigcheck -m yourapp.exe | findstr longPathAware,输出longPathAware = true才算成功
项目路径和 GOPATH 必须物理缩短
即使系统和构建都配对了,路径本身过长仍会触发 cmd.exe 参数长度限制(32767 字符),导致 go build 启动失败,或 go mod download 因 shell 层截断而报错。
Go 配置库,使用 spf13/viper — 分层优先级(flag > env >file > KV > default),提供 BindPFlag/BindPFlags、SetEnvPrefix + SetEnvKeyReplace 等功能。
立即学习“go语言免费学习笔记(深入)”;
- Go SDK 安装路径不能是
C:\Program Files\Go,应重装到D:\Go -
GOPATH不能是C:\Users\Alice\go,应设为D:\g(注意:模块模式下GOPATH仅用于pkg和bin,但路径短能避免go env -w GOPATH=D:\g生效后仍因父目录过长引发问题) - 项目根目录避免嵌套过深,例如不用
C:\Users\Alice\Documents\GitHub\org\repo\cmd\server,改用D:\p\myapp - JetBrains Goland 安装路径也需挪到短路径,如
D:\JetBrainsGoland,否则其内部调用的go命令可能因 IDE 自身路径过长而失败
模块模式下别再碰 GOPATH/src
路径冗余的根源常是旧习惯残留:$GOPATH/src/github.com/user/repo 这种结构在模块模式下完全多余。只要项目根有 go.mod,所有依赖走 pkg/mod 缓存,不再写入 src。
- 新项目一律用
go mod init example.com/myapp初始化,import路径必须匹配module声明 - 已有项目可直接删掉
$GOPATH/src下对应目录,go build仍能工作(前提是go.mod存在且go list -m显示模块名) - CI/Docker 中显式设置
WORKDIR /p(而非/home/user/project),并确保GOBIN指向短路径
最容易被忽略的是三者必须同时满足:系统注册表开关 + 构建 manifest + 物理路径缩短。只做其中一两项,依然会在某个环节卡住——比如 manifest 对了但 go.mod 在 C:\Users\...\deep\nested 下,go build 进程启动前就被 shell 截断了。

















