climate安装后无颜色因未实例化调用且默认禁用非tty环境颜色;需显式创建实例、设置colors=true或climate_colors=1,并在docker/github actions中启用pty或force_color。

直接用 League\CLImate 就能输出带颜色、图标、格式化的终端日志,但默认安装后不生效——因为没调用它的实例,也没处理 CLI 环境检测和颜色支持 fallback。
安装后为什么 var_dump() 一样没颜色?
Composer 安装只是把类库放进 vendor/,CLImate 不会自动劫持 echo 或重写 PHP 原生输出函数。你得显式创建实例并调用它的方法:
-
composer require league/climate后,必须$climate = new \League\CLImate\CLImate(); - 所有彩色输出都要走
$climate->red('error')、$climate->info('done')这类方法,不能直接 echo - 如果在非交互式环境(比如 CI 管道、重定向到文件)运行,
CLImate默认禁用颜色——它会检测stdout是否为 TTY,不是就不上色
强制开启颜色的三种方式(按推荐顺序)
多数人卡在这步:本地终端有颜色,一上服务器或进 Docker 就变白。根本原因是 CLImate 的 detectColorSupport() 返回 false。解决方法:
- 启动时传入配置:
$climate = new \League\CLImate\CLImate(['colors' => true]); - 或运行前设环境变量:
export CLIMATE_COLORS=1(Linux/macOS)或set CLIMATE_COLORS=1(Windows CMD) - 终极方案:手动 patch 输出器(不推荐),改用
$climate->output->enableColors()—— 但这个方法在 v4+ 已被移除,仅 v3.x 支持
info()、success()、warning() 这些方法怎么选?
它们不只是换颜色,还自带前缀图标和语义化样式,适合不同场景:
-
$climate->info('Connecting...')→ 蓝色 +ℹ图标,适合状态提示 -
$climate->success('OK')→ 绿色 +✔,适合完成确认(注意:某些终端字体不显示 ✔,可 fallback 为[OK]) -
$climate->warning('Deprecated')→ 黄色 +⚠,适合软性提醒 -
$climate->error('Failed')→ 红色 +✘,且默认输出到stderr,符合 Unix 习惯 - 自定义颜色用
$climate->blue('text')、$climate->bgRed('highlight'),但别滥用——太多颜色反而难读
Docker / GitHub Actions 里颜色消失的真正原因
不是「不支持 ANSI」,而是 CLImate 检测到 stdout 不是 TTY 设备就静默关色。Docker 默认不分配伪终端(PTY),GitHub Actions runner 也默认关闭 TTY。实操解法:
- Docker 运行加
-t参数:docker run -t myapp php script.php - GitHub Actions 中,在
run:步骤前加env: { FORCE_COLOR: '1' }——CLImate会识别该环境变量并启用颜色 - PHP 脚本开头加判断:
if (!defined('STDOUT')) define('STDOUT', fopen('php://stdout', 'w'));,再确保CLImate实例化前没其他输出干扰
颜色本身不难,难的是环境适配链:终端能力 → PHP 进程是否感知 TTY → Composer 类加载时机 → CLImate 实例化时机 → 输出目标是否为 stderr/stdout。漏掉任意一环,就退回白底黑字。











