加 --verbose 可暴露 HTTP 请求、包解析路径、镜像源地址等被默认隐藏的关键线索,配合 --no-cache 才能准确定位网络或版本瓶颈,重点盯 Reading、https://、Skipped 三类行。

加 --verbose 就能看见真实下载行为,不是“多打几行”,而是暴露 HTTP 请求、包解析路径、镜像源地址这些被默认吞掉的关键线索。
为什么 composer install 卡住却没报错?
Composer 默认只显示“Installing dependencies”这种高层状态,底层卡在哪完全不告诉你。常见现象包括:
-
Loading composer repositories停住几分钟,终端静默 - 报
Could not fetch但不说哪个包、哪个 URL、哪台镜像挂了 - 升级 Laravel 时提示版本冲突,却分不清是
composer.lock锁死,还是某个子包把 PHP 版本拉低了
加 --verbose 后你会看到类似这样的真实输出:
Reading /var/www/myapp/composer.json GET https://mirrors.aliyun.com/composer/p2/monolog/monolog.json Resolving dependencies through SAT Trying rule: monolog/monolog == 3.5.0 Skipped monolog/monolog because it requires php ^8.1
最后一行反复出现 Skipped + 包名 + because it requires php,就说明瓶颈在 PHP 版本,不是包本身冲突。
--verbose 和 --no-cache 要一起用
缓存会掩盖真实网络行为——比如一个包上次下载失败,缓存里还留着半截,--verbose 可能跳过重试直接报错。搭配 --no-cache 才能确认是不是镜像源、DNS 或代理真出了问题。
- 单独用
--verbose:可能看到 “Using version ^3.5 for monolog/monolog”,但实际是从缓存读的 - 加
--no-cache --verbose:你会看到完整的GET https://...请求链,甚至 404 或 timeout 细节 - 注意:不要和
--dry-run混用——它跳过真实安装,--verbose日志量会少很多,容易漏关键回溯路径
怎么看懂满屏 --verbose 输出?盯这三类行
它输出的是调试流,不是用户日志,别从头读。重点过滤:
- 以
Reading开头的行:确认 Composer 读的是你预期的项目根目录,不是父目录或全局composer.json - 含
https://的行:所有远程请求 URL,复制进浏览器或curl -I测试是否可达(比如curl -I https://mirrors.aliyun.com/composer/p2/monolog/monolog.json) - 含
Skipped或Resolving dependencies的行:依赖回溯的真实路径,能看出哪个require触发了对 PHP 版本、扩展或平台配置的二次检查
复杂点在于:回溯过程是递归尝试的,--verbose 会打出几百行中间状态,但真正决定成败的往往只是最后 10 行里的某一条 Skipped 或某次 GET 超时——别被前面的冗余信息带偏。











