必须先启用windows长路径支持,否则composer等工具仍会因max_path限制报错;可通过组策略(专业/企业版)或注册表(所有版本)启用longpathsenabled=1,并重启系统生效。

Windows 启用长路径支持是前提,否则其他配置都白搭
Composer 在 Windows 上报 The filename or extension is too long 或 mkdir(): Invalid argument,90% 是系统级 MAX_PATH 限制没打开。这不是 Composer 配置能绕过的——哪怕你把 vendor-dir 设成 v,深层嵌套的依赖(比如 vendor/symfony/console/Command/LazyCommand/Factory/Resolver/Chain/Provider/Adapter/Wrapper/Proxy/Registry/Builder/Compiler/Pass/Integration/Tests/Unit/Helper/Stub/Example/Scenario/Driver/Adapter/Http/Client/Factory/Pool/Manager/Registry/Cache/Adapter/TagAware/Adapter/Provider/Chain/Resolver/Factory/Command/Lazy/Command/Proxy/Registry/Builder/Compiler/Pass/Integration/Tests/Unit/Helper/Stub/Example/Scenario/Driver/Adapter/Http/Client/Factory/Pool/Manager/Registry/Cache/Adapter/TagAware/Adapter/Provider/Chain/Resolver/Factory/Command/Lazy/Command/Proxy)照样超限。
必须做两件事:
- 以管理员身份运行
gpedit.msc→ 计算机配置 → 管理模板 → 系统 → 文件系统 → 启用 Win32 长路径 → 已启用 - 重启电脑(只重启终端或 PHP 进程无效)
家庭版用户改注册表:HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlFileSystemLongPathsEnabled 设为 1,同样必须重启。
项目路径越短越好,别信“放桌面也行”
Windows 路径长度是累计值:磁盘根目录 + 项目路径 + vendor 内部嵌套。一个 C:UsersAliceDocumentsGitHubmy-laravel-appendor 开头就占了 50+ 字符,留给嵌套的空间所剩无几。
实操建议:
- 把项目挪到
C:p、D:proj这类单字母前缀路径下,直接省掉上百字符 - 路径中避免空格和中文,哪怕不触发长度问题,也会让某些旧版 Composer 插件或 PHP 扩展解析失败
- 不要用 OneDrive 或 Dropbox 同步文件夹作为项目根目录——它们会在路径前加隐藏代理层,进一步挤压可用长度
vendor 目录位置和命名要手动控制
composer.json 里的 config 段不是摆设,但得写对地方:
- 缩短目录名:
"vendor-dir": "v"比默认vendor少 5 字符,积少成多 - 移到短路径:
"vendor-dir": "C:/v"(注意斜杠方向),再配合mklink /D C: D:longpath oprojectendor映射,物理路径短、逻辑路径清晰 - 禁用符号链接:
"symlink": false,尤其在 NTFS 权限受限或网络驱动器上,symlink失败常被误判为路径过长
别在全局 config 里设 vendor-dir——它只影响 composer global,对项目 install 无效。
PHP 和 Composer 版本不匹配,长路径开关等于没开
即使系统开了 LongPathsEnabled,旧版 PHP 和 Composer 仍会无视它:
- PHP 必须 ≥ 7.4.0,且
enable_dl = Off(默认),fopen()、mkdir()才真正走\?前缀路径 - Composer 必须 ≥ 2.2.0,才内置路径规范化逻辑;2.0.x 或 1.x 即使系统支持也大概率失败
- 验证是否真通:在 PHP 里跑
var_dump(is_dir('\?C: esterylongpath'));,返回true才算生效
很多人卡在这一步:系统开了、路径缩了、配置写了,但 PHP 版本太老,所有努力白费。
最常被跳过的环节是重启——组策略或注册表改完不重启,LongPathsEnabled 对当前会话完全不生效。还有人用 PowerShell 改环境变量 PATH 临时加 AppDataRoamingComposerendorin,却忘了这跟路径长度问题毫无关系。











