根本原因是Windows下文件被进程占用,而非权限不足;Composer删除vendor目录失败主要因Defender、IDE或Explorer锁定文件,NTFS不支持chmod/chown,有效解法是--no-scripts+手动Remove-Item-Force+预防性排除杀毒扫描。

根本原因不是权限不足,而是 Windows 下文件被进程占用(尤其是 antivirus、IDE、Explorer)。Composer 的 Could not delete 错误 90% 以上发生在 Windows,且 chmod/chown 类操作完全无效——因为 NTFS 不支持 Unix 权限模型。
为什么 composer install 或 update 会卡在删除 vendor 目录?
Composer 在更新依赖前会尝试清空 vendor/ 或某个包目录,但 Windows 不允许删除正在被其他进程打开的文件(哪怕只是被 Explorer 缩略图缓存扫描过)。常见触发进程包括:
- Windows Defender 实时防护(默认扫描所有新写入的 PHP 文件)
- PHPStorm / VS Code 的文件监听器(即使没打开项目,也可能后台索引)
-
资源管理器窗口停留在
vendor/或其子目录中(哪怕只是路径栏里显示着) - 另一个未关闭的
cmd或PowerShell正在该目录下执行过命令
真正有效的绕过方式:用 --no-scripts + 手动清理 + 重试
不硬刚文件锁,改用 Composer 自带的“跳过清理阶段”策略,再分步处理:
- 先运行
composer update --no-scripts --no-plugins,跳过 post-update-cmd 等可能触发文件读取的脚本 - 手动进入项目根目录,用 PowerShell 执行:
Remove-Item -Path "vendor" -Recurse -Force
(-Force可绕过只读属性,比rd /s /q更稳定) - 再运行
composer install --no-dev(或按需加--with-all-dependencies)
一劳永逸的预防设置(Windows 必配)
避免每次都被卡住,建议在项目级或全局配置中关闭自动清理和实时干扰:
- 禁用 Composer 自动清理旧包:在
composer.json中添加"config": { "autoloader-suffix": "dev", "fxp-asset": {"enabled": false}, "discard-changes": true }(discard-changes防止因 git dirty 导致清理失败) - 临时关闭 Windows Defender 实时扫描:PowerShell 管理员运行
Add-MpPreference -ExclusionPath "你的项目路径" - 在 PHPStorm 中关闭 “Synchronize files on frame activation” 和 “Track only root folders”(Settings → System Settings → Synchronization)
最常被忽略的一点:杀毒软件排除路径必须包含完整项目路径,不能只写 D:\myproject 而漏掉末尾反斜杠或大小写不一致;另外,vendor/ 删除失败后残留的 .git 子模块或 composer.lock 锁定状态,也可能导致下次运行时静默跳过清理——这时需要手动删 lock 文件再重试。










