Windows系统默认MAX_PATH限制为260字符,导致Composer报“File path too long”错误;根本解决需启用长路径支持:通过设置→系统→高级中开启开关,或正确修改注册表HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlFileSystem下LongPathsEnabled为DWORD值1并重启,且新进程才生效。

composer 在 Windows 上报 File path too long 错误,本质是 Windows 默认的 MAX_PATH 限制(260 字符)被突破。这不是 composer 的 bug,而是系统级限制。必须先开启 Windows 长路径支持,否则任何缓存路径、符号链接或 Composer 配置都只是临时绕路,治标不治本。
为什么组策略或注册表改了还不生效?
常见原因不是没改对,而是没“真正启用”:
- 组策略修改后未运行
gpupdate /force,也未重启——改完必须重启或强制刷新策略 - 注册表项
LongPathsEnabled被建在错误位置:必须位于HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlFileSystem,不能在CurrentUser下 - 值类型写成字符串(
REG_SZ)而非DWORD (32-bit),或数值填了"1"(带引号字符串)而不是数字1 - 目标应用(如
php.exe或终端)启动于长路径启用前——需关闭所有 CMD/PowerShell/IDE 再重开
Windows 11 25H2 及新版设置入口变了
2025 年起,微软把长路径开关移到图形界面,但很多人还在找 gpedit.msc:
Windows 命令行编码与兼容规范。涵盖 GBK/UTF-8 编码、PowerShell/pwsh 互操作、Python/Node.js、Git 配置及代码生成规则。适用于 Windows 10/11 + MSYS2/Git Bash 环境下的所有命令行操作。
- 按
Win + I打开「设置」→「系统」→「高级」→ 找到「启用长路径」开关,打开它 - 该设置等价于注册表
LongPathsEnabled = 1,无需手动进注册表 - 仍需重启,且仅对新启动的进程生效(旧 CMD 窗口不会自动继承)
Composer 本身能做的有限,别依赖配置绕过
有人试图用 composer config --global cache-dir D:c 缩短缓存路径,或用 mklink 建短链接——这些操作容易引发新问题:
-
cache-dir只影响包缓存,不影响vendor/解压路径,而报错多发生在vendor/层级嵌套后 - 符号链接在 Git Bash / WSL 下行为不一致,
composer install可能跳过链接或报权限错误 -
COMPOSER_HOME改到根目录(如D:c)看似有效,但一旦项目路径本身很长(比如C:UsersNameDocumentsProjects...src...),依然会触发限制 - 真正可靠的 fallback 是 WSL:在 WSL 中运行
composer完全不受 WindowsMAX_PATH影响,且 PHP 环境一致
.NET 应用或自研工具要处理长路径?
如果你在写一个调用 composer 的 .NET 工具,或封装 PHP 脚本,仅改系统设置还不够:
- 必须在应用的
.manifest文件中声明:<longPathAware xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">true</longPathAware> - PHP 自身从 7.4+ 开始默认支持长路径 API,但旧版(如 7.2)即使系统开了,
file_exists()等函数仍可能失败 - 路径传给 PHP 时,避免拼接出超长字符串再传入;优先用
\?前缀(如\?C:erylongpath),该前缀可绕过MAX_PATH检查,但要求路径为绝对路径且无相对符号(..、.)
系统级长路径支持不是“可选优化”,而是 Windows 下现代 PHP 开发的基础设施。没开它,所有基于路径的操作(包括 git clone、npm install、IDE 索引)都可能在深层依赖里突然崩掉——而且错误信息往往不指向根源。

















