composer install 卡住却无报错是因为默认日志级别过低,-vvv 可显示完整网络请求、依赖解析和脚本执行细节,精准定位 dns 超时、api 限流或证书错误等问题。

composer install 为什么卡住却没报错
因为默认日志级别太低,很多网络请求、依赖解析、脚本执行细节都被静默丢弃了。不加参数时 composer install 只输出成功/失败的粗粒度结果,连哪个包在下载、是否在重试、有没有 404 都看不到。
实操建议:
- 用
-vvv(三个 v)开启最详细日志:它会打印每个 HTTP 请求的 URL、响应状态、重试次数、临时目录路径、脚本执行命令和 stdout/stderr 输出 - 别用
-vv:它只显示依赖图和部分命令,漏掉关键网络和钩子信息 - 如果遇到“卡在 Updating dependencies”不动,
-vvv通常会在下一行立刻暴露是 DNS 超时、GitHub API 限流还是私有仓库证书错误
使用 -vvv 后日志太多看不过来怎么办
日志量爆炸不是 bug,是设计如此——它把 Composer 内部所有 IOInterface::writeError() 和 HttpDownloader 的 debug 日志全打出来。但你不需要从头读完。
实操建议:
- 重点关注含
Downloading、Cloning、Executing command、Failed to decode、401 Unauthorized的行 - 搜索
github.com或你的私有源域名,快速定位网络环节问题 - 遇到
file_put_contents(/tmp/composer...): failed to open stream这类错误,说明磁盘满或权限不对,-vvv会明确写出那个失败的路径
为什么 -vvv 有时不打印某些脚本输出
因为 Composer 对 scripts 的日志控制是分层的:只有通过 Composer\Script\Event 触发的脚本才会被 -vvv 捕获;而直接写在 post-install-cmd 里、用 exec() 或 shell_exec() 调用的外部命令,默认不继承父进程的 verbose 级别。
实操建议:
- 检查
composer.json中的脚本定义,确认是否用了"@php script.php"这种可被拦截的写法,而不是"php script.php" - 若必须用 shell 命令,手动加
-v到子命令里,比如"php -d display_errors=1 script.php" -
-vvv不影响dump-autoload的输出逻辑,但会显示它跳过了哪些文件——这能帮你发现 autoloader 配置遗漏
Windows 下 -vvv 报错 “The system cannot find the path specified”
这不是 -vvv 的问题,而是 Windows 默认临时目录(如 %TEMP%)路径含空格或中文,且某些 Composer 插件(如 hirak/prestissimo 已废弃,但遗留配置还在)调用 curl/wget 时没加引号包裹路径。
实操建议:
- 运行
echo %TEMP%看路径,如果含空格(如C:\Users\John Doe\AppData\Local\Temp),就设新变量:set COMPOSER_CACHE_DIR=C:\temp\composer - 删掉
composer.json里残留的"prestissimo"或其他已废弃插件 - 升级到 Composer 2.5+,它对 Windows 路径的引号处理更健壮,但
-vvv日志里仍会原样打印出那个未加引号的失败命令,方便你反向定位
真正麻烦的是那些不抛异常、只默默跳过步骤的场景——比如某个 post-autoload-dump 脚本因权限失败被吞掉,-vvv 是唯一能让你看见它根本没执行过的办法。










