composer diagnose 能查json合法性、php基础扩展、vendor权限、packagist连通性、git存在性;不能查ext-*扩展真实安装、私有token有效期、platform伪造、autoload路径文件存在性。

composer diagnose 能查什么,不能查什么
它能告诉你 composer.json 是不是合法 JSON、PHP 版本和基础扩展(json、openssl、phar 等)有没有加载、vendor/ 目录是否可写、能不能连上 packagist.org、Git 命令是否存在——仅此而已。
它**不会**检查你写的 "ext-redis": "*" 对应的 redis 扩展是否真装好了;不会验证私有仓库的 token 是否过期;不会发现 platform 配置伪造了 PHP 版本却实际不匹配;也不会管 autoload 的 PSR-4 路径下压根没文件。
- 常见误判场景:
Checking platform settings: OK但composer install报ext-imagick missing→ 因为 diagnose 只看 PHP 自带扩展是否启用,不看ext-*声明是否真实满足 - 网络“OK”但 install 卡住 → diagnose 测的是 HTTP HEAD 请求,不模拟实际包下载,代理或 DNS 劫持可能漏检
-
composer.lock格式合法 ≠ 内容有效 → 它只解析 JSON,不校验其中的 hash 或 dist URL 是否还能访问
怎么用 -v 参数看到真正有用的线索
默认输出太简略,composer diagnose -v 才是日常排查主力。它会暴露路径、权限细节、具体哪行 JSON 出错、连哪个 URL 超时——这些才是修复依据。
- 看到
The "vendor" directory is not writable?-v会告诉你实际检查的是/path/to/project/vendor,而不是你以为的全局 vendor - 报
CA certificate bundle not found?-v会显示 Composer 正在读取的cafile路径,方便你核对composer config -g cafile是否指向有效证书 - 提示
composer.json is invalid?-v会标出具体行号和错误类型,比如Parse error on line 12: unexpected ','
遇到 ERROR 别急着重装,先分清三类问题
diagnose 输出里出现 ERROR(不是 WARNING),基本对应三类可快速定位的问题:
-
文件格式错误:直接打开
composer.json,按-v提示的行号查 JSON 语法(多逗号、少引号、注释、尾随逗号) -
权限拒绝:常见于 Docker 或 CI,
ls -ld vendor/看 UID 是否匹配;临时修复用chmod u+rw vendor/,但别提交到 git -
网络不通:如果
Checking https connectivity to packagist: FAIL,先手动试curl -I https://packagist.org/packages.json,再查composer config -g http-proxy是否残留无效代理
validate 和 diagnose 到底谁该先跑
两个命令目的不同:composer validate 只盯 composer.json 结构和字段语义(比如 require 必须是对象、版本约束格式是否合法);composer diagnose 是全链路环境扫描,包含网络、权限、PHP 运行态。
- 新建项目或改完
composer.json后,先跑composer validate→ 快、准、专治手抖写错 JSON - install/update 失败时,再跑
composer diagnose -v→ 它能暴露 validate 永远看不到的问题,比如 vendor 权限、CA 证书路径、git 命令缺失 - 两者都 OK,还失败?那问题一定在依赖图本身——比如冲突版本、私有包不可达、或
platform配置骗过了 diagnose 却骗不过真实安装逻辑
最常被忽略的一点:diagnose 不读取项目级 composer.json 里的 config 设置(比如自定义 fxp-asset 配置),也不校验插件是否正常加载。它只检查 Composer 自身运行的最小可行环境——这点决定了它永远只是排查起点,不是终点。










