windows下composer install卡在“could not delete vendor/xxx”本质是文件被占用或权限异常,需终止相关进程、禁用预览窗格、以管理员身份暴力删除;linux/macos则多因只读属性,需chmod修复。

Windows 下 composer install 卡在 “Could not delete vendor/xxx”
本质是 Windows 文件系统锁住了目录或文件,常见于 PHP 进程(如 XAMPP/WAMP 的 Apache)、IDE(PHPStorm/VS Code 的文件监视器)、杀毒软件或资源管理器预览窗格正在访问 vendor 目录。Composer 本身没权限问题,它只是调用系统命令删不掉。
实操建议:
- 关掉所有可能占用
vendor的进程:停止 Apache/Nginx、退出 PHPStorm(不是仅关闭窗口,要彻底退出进程)、禁用 Windows 资源管理器的“预览窗格”和“详细信息窗格” - 用 PowerShell 以管理员身份运行:
cmd /c "rd /s /q vendor"
,比 Composer 自带的删除更暴力有效 - 临时关闭实时防护(如 Windows Defender 的“实时保护”),尤其当你刚执行过
composer update后立刻删失败时 - 避免在 OneDrive 或 Dropbox 同步目录里跑
composer—— 这些客户端会锁定正在变化的文件
Linux/macOS 中 rm -rf vendor 失败但提示 “Permission denied”
不是权限不够,而是 vendor 里某些文件被标记为只读(常见于从 Windows 拷贝来的项目、Git 检出的子模块、或某些包的 post-install-cmd 脚本误设了 chmod 444)。
实操建议:
- 先查问题文件:
find vendor -not -writable -type f | head -10
,确认是不是真有只读文件 - 批量修复(谨慎!确保你在项目根目录):
find vendor -type f -not -writable -exec chmod 644 {} \;;对目录用755:find vendor -type d -not -writable -exec chmod 755 {} \; - 如果用了
sudo composer install,后续普通用户操作会持续出问题 —— 别用 sudo,改用chown -R $USER:$USER vendor归还所有权 - 检查
umask:某些 CI 环境或 Docker 容器中umask 027会导致新建文件无组写权限,Composer 解压时继承该掩码,删的时候就卡住
composer clear-cache 能解决删除失败吗?
不能。缓存清理只影响 ~/.composer/cache,和 vendor 目录完全无关。很多人误以为“清缓存=清本地依赖”,其实它只是删下载过的 zip 包和 dist 包索引,不影响已安装的代码。
实操建议:
- 遇到删不掉
vendor,别浪费时间跑composer clear-cache - 真正需要的是重置本地状态:
rm -rf vendor composer.lock && composer install
(注意:这会重装全部依赖,版本可能变) - 若想保留
composer.lock但强制重建vendor,用:composer install --no-cache
,跳过本地缓存解压逻辑,直接从 lock 文件拉取
CI/CD 流水线里反复出现 “Could not delete vendor”
根本原因是容器或 runner 的文件系统层残留(比如 Docker layer 缓存了旧的 vendor 权限位,或 runner 复用工作目录没清干净),不是 Composer 配置问题。
实操建议:
- 流水线脚本开头加强制清理:
rm -rf vendor && mkdir vendor
,别依赖composer install自动处理 - 用
composer install --no-scripts --no-plugins避免第三方插件(如hirak/prestissimo)在安装中途修改文件权限 - GitHub Actions 中,禁用
actions/cache缓存vendor—— 缓存二进制依赖不如缓存 Composer 的 dist 包(~/.composer/cache)安全 - Docker 构建时,不要
COPY . .后直接composer install;把composer.json和composer.lock单独 COPY 并 RUN install,再 COPY 其余代码
最麻烦的情况其实是混合开发:Windows 写代码、Linux 构建、Git 提交时保留了 Windows 的只读位(git config core.filemode false 关闭后更难察觉)。这时候得靠 find + chmod 组合拳,别指望一个命令一劳永逸。










