windows 10/11需启用longpathsenabled注册表项才能解压深层嵌套的vendor包,否则composer install会因路径超260字符失败;管理员powershell执行set-itemproperty启用后重启终端即可生效,无需重启系统。

Windows 10/11 中必须开启 LongPathsEnabled 才能解压完整 vendor
Composer 在 Windows 上创建 vendor 目录失败,尤其是报错 failed to extract ... path too long 或直接卡在 Installing dependencies,根本原因不是 Composer 配置问题,而是 Windows 默认禁用长路径支持。从 Windows 10 1607 起系统支持 >260 字符路径,但需手动启用——否则哪怕你用 Git Bash、PowerShell 或管理员身份运行,composer install 仍会在解压嵌套较深的包(如 symfony/console 的测试文件、phpunit/phpunit 的依赖树)时静默失败或抛出 ERR! spawn ENOENT 类似错误。
实操建议:
- 以管理员身份运行 PowerShell,执行:
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\FileSystem" -Name "LongPathsEnabled" -Value 1
- 重启终端(CMD/PowerShell/Git Bash),再运行
composer install—— 不需要重启系统,但旧终端进程不会继承新注册表值 - 验证是否生效:在 PowerShell 中运行
Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\FileSystem" -Name "LongPathsEnabled",返回值为1即成功
PHP 进程本身也受 Windows 路径长度限制影响
即使注册表已开启 LongPathsEnabled,PHP 的某些内置函数(如 realpath()、is_dir()、file_exists())在旧版 PHP(
实操建议:
- 升级到 PHP 7.4 或更高版本(推荐 8.1+),PHP 7.4 起正式支持
LongPathsEnabled并修复了多数路径处理逻辑 - 检查当前 PHP 版本:
php -v;确认是否使用 NTS(非线程安全)版本——VC 编译的 NTS 版本对长路径兼容性更稳定 - 避免混用不同 PHP 版本:Composer 可能调用系统 PATH 中的 PHP,而 IDE 或 CLI 当前用的是另一个,用
where php查看实际调用路径
Composer 自身配置无法绕过 Windows 路径限制
有人尝试改 composer.json 的 config.process-timeout、加 --no-scripts、甚至换 cache-dir 到短路径盘符(如 D:\c),这些操作对长路径报错无效。因为问题发生在 zip 解压阶段(由 composer/composer 内部的 ZipArchive 或 unzip 命令触发),而非脚本执行或缓存读写。
实操建议:
-
composer config --global cache-dir改缓存路径只影响下载包缓存,不影响vendor解压目标路径长度 -
COMPOSER_HOME环境变量指向短路径,也无法缓解vendor/下生成的嵌套目录深度问题 - 不要依赖
git clone替代composer install:虽然跳过了 zip 解压,但vendor里大量包仍含超长测试路径,Git for Windows 同样受LongPathsEnabled控制
WSL2 下无此问题,但跨系统路径映射有陷阱
如果你在 WSL2 中运行 composer install 到 /mnt/c/...(即 Windows 文件系统),依然会触发 Windows 层的路径限制,因为底层仍是 NTFS 驱动挂载。只有真正放在 WSL2 原生 ext4 分区(如 ~/project)才彻底规避。
实操建议:
- 把项目放在 WSL2 home 目录下,而不是
/mnt/c/Users/xxx,否则和 Windows 原生环境一样会失败 - VS Code 连接 WSL2 开发时,确保打开的是 WSL2 文件系统路径(左下角显示 “WSL: Ubuntu”),而非 Windows 路径
- 别在 Windows 和 WSL2 之间混用同一份
vendor:权限模型不一致,容易引发autoload.php not found或 class not found









