Composer install 默认在非TTY环境禁用进度条,并非bug而是主动降级;需确认STDIN是否为TTY、避免--no-progress、CI/Docker中加-t或script伪终端、检查config.no-progress配置。

composer install 没进度条?先确认是否被静默截断
默认情况下,composer install 在非 TTY 环境(比如 CI 脚本、重定向输出、某些 Docker 容器)中会自动禁用进度条和彩色输出——不是 bug,是 Composer 的主动降级行为。
常见现象:Loading composer repositories with package information 卡住几秒没反应,实际在后台跑,但你看不到下载/解压的实时进度。
- 检查当前终端是否为 TTY:运行
php -r "var_dump(\STDIN->isatty());",返回bool(true)才算合格 - CI 环境(GitHub Actions、GitLab CI)默认无 TTY,必须显式启用
- 某些 IDE 内置终端(如 PHPStorm 的 Terminal)可能未正确继承 TTY 属性
开启详细输出:-v 和 --no-progress 不能混用
-v(verbose)能显示更多日志,但它本身不恢复进度条;真正控制进度条的是 --no-progress 这个开关——注意它是「禁用」选项,所以要让它失效,得**不加它**,或者显式用 --progress。
- ✅ 正确开启进度条:
composer install --progress或composer install -v(-v 默认启用 progress) - ❌ 错误写法:
composer install -v --no-progress,后者会覆盖前者的进度显示 - ⚠️
-vv和-vvv会进一步增加日志密度,但进度条仍存在;-vvv甚至会打印完整 HTTP 请求头,适合排查网络卡顿
Docker 或 CI 中强制启用进度条的实操方案
在容器或自动化环境中,即使加了 --progress,仍可能因 stdout 非交互式而失效。这时需要模拟 TTY 行为或绕过检测逻辑。
- Docker 运行时加
-t参数:docker run -t --rm -v $(pwd):/app -w /app php:8.2-cli composer install --progress - GitHub Actions 中,用
run: composer install --progress即可,新版 runner 已默认支持 TTY;若旧版失效,改用run: script -qec "composer install --progress" /dev/null强制分配伪终端 - 避免重定向覆盖输出:
composer install --progress > log.txt会丢失进度条,应改用composer install --progress 2>&1 | tee log.txt
进度条消失但安装成功?可能是插件或自定义脚本干扰
某些 Composer 插件(如 hirak/prestissimo 已废弃,但残留配置仍影响)、或项目根目录下的 composer.json 中启用了 "config": { "no-progress": true },会全局压制进度条。
- 检查项目级配置:
composer config --list | grep no-progress,输出config.no-progress true就是它干的 - 临时绕过:
composer install --progress --no-plugins可排除插件影响 - 全局配置路径通常为
~/.composer/config.json,注意no-progress是否设为true
进度条本质是 UI 层反馈,不影响安装逻辑;但缺失时容易误判卡死。最稳的做法是:本地开发用 composer install --progress,CI 里优先确保 TTY 可用,再补上 --verbose 看关键步骤耗时——毕竟真正拖慢安装的,往往是 packagist 响应、git clone 深度或 autoloader 生成,而不是进度条本身。










