composer list 不支持 --json 参数,正确获取结构化命令列表需用 composer list --raw 配合解析,或通过 php 脚本调用 composer 内部 application api 生成标准 json。

composer list 命令本身不支持 --json 参数
直接运行 composer list --json 会报错:Unrecognized option: --json。Composer 的 list 命令只输出格式化文本,不提供原生 JSON 输出能力——这是自动化脚本里最容易卡住的第一步。
想拿到结构化数据,得绕过命令本身限制,用其他方式“提取+转换”:
- 用
composer list --raw获取简洁、无装饰的纯文本列表(每行一个命令),再按空格/制表符解析; - 或用
composer list -n(--no-ansi)减少控制字符干扰,配合正则提取命令名和描述; - 更稳妥的做法是调用 Composer 的 PHP API,通过
Application实例获取Command对象数组,然后json_encode输出。
用 PHP 脚本调用 Composer 内部 API 生成 JSON
Composer 是 PHP 程序,它的命令列表在运行时由 Symfony\Component\Console\Application 管理。你可以在项目根目录下写一个临时脚本(比如 dump-commands.php)直接复用其逻辑:
<?php require 'vendor/autoload.php';
use Composer\Console\Application;
use Symfony\Component\Console\Output\JsonOutput;
$app = new Application();
$commands = [];
foreach ($app->all() as $name => $command) {
if ($name === 'list') continue; // 跳过 list 自身,避免递归
$commands[] = [
'name' => $name,
'description' => $command->getDescription(),
'aliases' => $command->getAliases(),
];
}
echo json_encode($commands, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT) . "\n";
执行 php dump-commands.php > commands.json 就能得到标准 JSON,后续可被 jq、Python 或 CI 脚本直接消费。
用 jq 或 shell 解析 raw 输出时注意字段分隔不稳定
composer list --raw 输出看似规整,但命令名长度不一,靠空格切分容易出错(比如 cache:clear 和 cache:warmup 后面跟的描述可能被截断)。常见陷阱包括:
- 命令名含冒号(
:)时,cut -d' ' -f1会失效; - 描述中含多个连续空格或制表符,
awk '{print $1}'可能漏掉别名; - 某些插件命令(如
phpstan、larastan)注册时未设描述,导致字段错位。
如果坚持用 shell,建议先用 composer list --raw | sed 's/^[[:space:]]*//; s/[[:space:]]*$//' | grep -v '^$' 清理空白,再逐行用 awk 匹配开头非空格字符直到第一个双空格或制表符——但这已接近正则解析,不如直接走 PHP 方案可靠。
CI/CD 中生成命令清单需注意 vendor 目录存在性
自动化脚本常放在 CI 流水线里运行,但 vendor/autoload.php 在未执行 composer install 前不存在。若用 PHP API 方式,必须确保:
-
composer install --no-dev已完成(除非脚本仅依赖composer/composer自身); - 或改用
composer show --format=json查看已安装包,但它不包含命令列表; - 最轻量的兜底方案:把预生成的
commands.json提交到仓库,并在 CI 中用git diff检测命令变更(比如插件升级后新增了命令)。
真正难的不是转成 JSON,而是保证每次生成时环境一致、命令注册状态稳定——尤其当项目用了 composer-plugin-api 类插件时,命令可能随插件版本动态变化。










