composer validate 仅校验 json 语法和 composer 官方 schema,不解析依赖或联网验证;真正检测可行性需用 composer install --dry-run 和 composer validate --lock,ci 中必须组合 --strict --no-check-publish 使用。

composer validate 是唯一官方支持的本地校验命令,没有“在线校验工具”这种可靠选项——所有声称能在线解析 composer.json 的网页工具,既不读取 Composer 官方 JSON Schema,也不校验字段语义,纯属误导。
composer validate 报错却没行号?直接看 line/column 位置
Composer 不会模糊提示“语法可能有问题”,错误信息里写的 line 23 at column 17 就是精确出错点。别重写文件,打开编辑器跳转过去,重点查:
- 末尾多出的逗号(尤其在
"require"、"autoload"对象最后一项后) - 单引号代替双引号(
'name': 'myorg/myapp'❌,必须是"name": "myorg/myapp") - 从网页复制来的全角标点(如中文
,或:)、零宽空格(U+200B) -
//或/* */注释(JSON 标准不支持) - 文件编码是 UTF-8 with BOM(Windows 记事本易中招),右下角确认是纯 UTF-8
更快验证纯 JSON 合法性:运行 php -r "$j = file_get_contents('composer.json'); $d = json_decode($j); if (!$d) { echo json_last_error_msg().\"\n\"; }",报错更直白。
为什么 --strict 必须加,不加等于白跑
默认模式下,composer validate 对很多硬伤只警告不报错,CI 中完全失效:
-
"autoloader": {}→ 拼错字段名,应为"autoload",默认不拦 -
"type": "libary"→ 拼错且值非法,--strict 才报错 -
"license": "MIT License"→ 非 SPDX 标准值,默认仅警告 -
"minimum-stability": "dev-master"→ 已弃用写法,--strict 才拦截
CI 脚本必须用:composer validate --strict --no-check-publish。后者跳过 Packagist 发布检查,防网络超时中断流程。
使用ydata-profiling(前身为pandas-profiling)生成全面的数据质量报告,包含相关性分析、缺失值模式和基数检测。导出交互式HTML仪表板和JSON摘要。
validate 通过了,install 却失败?这是设计使然
composer validate 完全不联网、不查 Packagist、不运行依赖求解器。它只管字符串写得对不对,不管说的包存不存在、版本能不能解、PHP 版本匹不匹配:
-
"monolog/monolog": "999.0.0"→ validate 通过,install 报Could not find package -
"php": ">=8.0"→ validate 通过,但在 PHP 7.4 环境下 install 直接退出 -
"require": {"myorg/mylib": "dev-main"}→ validate 沉默,install 卡在找不到分支
真正暴露依赖问题的是:composer install --dry-run(Composer 2.5+ 稳定支持)。它走完整依赖求解流程:解析约束、比对平台配置、校验锁文件一致性,但不下载任何包。CI 中必须和 validate --strict 组合使用。
怎么确认 composer.json 和 composer.lock 一致
composer validate --lock 不是可选项,而是关键一致性校验。它强制比对 composer.json 当前内容的 hash 与 composer.lock 中记录的 hash 是否一致——防止手动改了 json 却忘了 composer update 或 composer install。
常见翻车场景:
- 改完
composer.json的require,直接 push,没跑 update → CI 上validate --lock直接失败 - 团队协作中有人手改
composer.lock→--lock校验立刻暴露
注意:--lock 和 --strict 可共存:composer validate --strict --lock --no-check-publish 是 CI 中最稳妥的组合。










